2016-08-03 13 views
0

Ich verwende rspec zum Testen eines Hashes enthält einen Schlüssel oder nicht.Ruby: Unterschiede zwischen() und [] in den Methodenparametern

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

aber durch Fehler, die ich ändern von normalen parenthese auf Platz parenthese:

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

Es tooks mich eine lange Zeit für die Fehlersuche mit Fehler:

NoMethodError: undefined method `[]'

Meine Frage ist: Rubin wirft keine Ausnahme über diese Grammatik ist falsch, aber Ausnahme über undefined method so bin ich neugierig, wie Rubin Methode mit quadratischen Klammern verstehen.

dank

Antwort

3

, wenn Sie eine Methode in Ruby rufen Sie () verwenden. Manchmal können Sie [] für ein bestimmtes Objekt verwenden und es funktioniert, aber nur, weil der Typ dieses Objekts [] Methode in seiner Definition definiert hat. zum Beispiel

class Foo 
    def [](key) 
    key 
    end 
end 

# and later you can call: 

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

Allgemeinen runden Klammern sind für die Angabe Argumente verwendet und eckigen Klammern sind für Indizierung Dinge.

Beispiel:

def is_a_method(a, b) 
end 

is_a_method(1,2) 

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

Sie sind nicht austauschbar. Wie viele Dinge beim Programmieren sind die genauen Charaktere wichtig.

Diese Dinge können gestapelt und kombiniert werden:

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

Das Ergebnis des JSON.parse(...) Methodenaufrufes ist, in diesem Fall ist eine Struktur-Hash-Daten. Rufen Sie ['data'] auf, um ein Element aus dieser Struktur herauszuziehen.

In vielen Fällen sind die runden Klammern optional, aber in einigen Fällen sind sie zur besseren Übersicht am besten enthalten. Zum Beispiel können Sie dies wie folgt ausdrücken:

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

Eckige Klammern sind nicht optional.

2

Es ist syntaktischer Zucker. [] und []= sind Methoden definiert für Array, Hash und andere Klassen. a ein Array gegeben, ich glaube,

a[0] = 5 

ist das gleiche von

a.[]=(0, 5) 

ich in irb versucht, es funktioniert :)

+0

zu klären, '[]' und '[] = 'sind eigentlich zwei getrennte Methoden auf' Array', siehe http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D und http://ruby-doc.org /core-2.2.0/Array.html#method-i-5B-5D-3D bzw. – photoionized

+0

Ja, sicher, aber guter Punkt. Ich werde diese Info hinzufügen :) – Ursus