2016-08-03 9 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ですので、ルビーが正方形の親子でメソッドを理解する方法が不思議です。

おかげで、あなたは()を使用するRubyでメソッドを呼び出す

答えて

3

。場合によっては、特定のオブジェクトに対して[]を使用することが許可されていますが、そのオブジェクトのタイプにはその定義に定義されている[]メソッドがあるためです。例えば

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'の2つの別個のメソッドです。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

関連する問題