2016-08-03 69 views
0

我正在使用rspec來測試散列是否包含密鑰。Ruby:方法參數中()和[]之間的區別

response_data = JSON.parse(response.body)['data'] 
expect(response_data).to have_key('store_id') 
expect(response_data).to have_key('store_name') 

但由於錯誤,我從正常parenthese改爲方形parenthese:

response_data = JSON.parse(response.body)['data'] 
expect(response_data).to have_key['store_id'] 
expect(response_data).to have_key['store_name'] 

這tooks我很長一段時間的調試錯誤:

NoMethodError: undefined method `[]'

我的問題是:紅寶石不會拋出關於這個語法的異常是錯誤的,但關於undefined method的例外,所以我很好奇紅寶石如何理解與方括號的方法。

感謝

回答

3
當你調用在Ruby中,你使用 ()的方法

。有時你可以在特定的對象上使用[],它可以工作,但只是因爲這個對象的類型在其定義中定義了[]方法。例如

class Foo 
    def [](key) 
    key 
    end 
end 

# and later you can call: 

foo = Foo.new 
foo['anything'] 
0

一般圓括號用於指定參數和方括號是索引事情。

例子:

def is_a_method(a, b) 
end 

is_a_method(1,2) 

is_a_hash = { a: 1, b: 2 } 
is_a_hash[:a] 

他們不能互換。像編程中的許多事情一樣,確切的字符很重要。

這些東西可以被堆疊並結合:

JSON.parse(response.body)['data'] 

JSON.parse(...)方法調用的結果是,在這種情況下,哈希數據結構。調用['data']就可以從該結構中抽出一個元素。

在許多情況下,圓括號是可選的,但在某些情況下,爲了清晰起見,最好包括它們。例如,您可以表示爲:

body = JSON.parse response.body 
body['data'] 

方括號不是可選的。

2

這是句法糖。 [][]=是爲Array,Hash和其他類定義的方法。 鑑於a陣列,我認爲

a[0] = 5 

是我在IRB嘗試同樣的

a.[]=(0, 5) 

,它工作:)

+0

澄清,'[]'和'[] = '實際上是'Array'上的兩個獨立方法,請查看http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D和http://ruby-doc.org /core-2.2.0/Array.html#method-i-5B-5D-3D分別爲 – photoionized

+0

是的,當然,但好點。我會添加此信息:) – Ursus