2016-04-24 3 views
-1

I versehentlich einen Raum zwischen dem Druckverfahren des Arrays und deren Parameter hinzugefügt, so habe ich folgendes:einen Raum zwischen „push“ und Klammer Hinzufügen verursacht einen Fehler in Ruby

def add_credit(description, amount) 
    @credits.push (description: description, amount: amount) 
end 

und es verursacht einen Fehler : syntax error, unexpected tLABEL @credits.push (description: description, amount: amount) ^

Nachdem ich den Raum nach "Push" entfernt hatte, war es weg. Wie wirkt sich der Platz auf die Syntax in Ruby aus?

+0

Ich kann sagen, dass der Interpreter von Ruby bei der Verwendung von '()' flexibel ist und deshalb manchmal Leerzeichen interpretiert. Beispielsweise wäre es für Sie gültig gewesen, '_credits.push description: description, amount: amount 'zu schreiben, und ruby ​​würde das'() 'für Sie hinzufügen. Ich vermute, dass die gleiche Parsing-Logik (die in diesem Fall die Klammer hinzufügen würde) durch Ihre Verwendung von Klammern und einem Leerzeichen verwirrt wird. Traditionell würde die Methode als '@ credits.push()' geschrieben werden. Ich werde auch darauf hinweisen, dass Sie einen Hash verwenden und die '{}' weglassen -> welcher Ruby fügt – John

Antwort

1

Die Ursache des Problems ist, dass der Ruby-Interpreter nicht herausfinden kann, ob das die Klammern oder das Argument einer Methode ist.

Zum Beispiel, wenn Sie ein Argument mit einer „einfachen“ Syntax Ihrer Methode übergeben, wäre es gut funktionieren:

[1, 2].include? 1  # => true 
[1, 2].include? (1)  # => true 
[1, 2].include? ([ ]) # => true 

Ruby-Interpreter erraten kann, dass diese Klammer Verfahren gehören.

Aber, wenn Sie versuchen, ein Argument zu übergeben, die nicht eine „einfache“ Syntax haben, zum Beispiel einen Hash (a: 1) oder einen Bereich ((1..2)), das würde einen Fehler verursachen:

[1, 2].include?(a: 1) # => false 
[1, 2].include? ({a: 1}) # => false 
[1, 2].include? (a: 1) # => SyntaxError: (irb):21: syntax error, unexpected tLABEL 
[1, 2].include? (1..2) # => false 

Da Ruby-Interpreter jetzt denken würde, dass Sie versuchen, eine Range als Argument übergeben. Und key: 'value' Syntax ist keine gültige Bereichdefinitionssyntax.

Also, Ruby-Interpreter bittet Sie, mit geschweiften Klammern klar zu sein und ihm zu helfen, klar zu identifizieren, wenn es die Klammern oder das Argument einer Methode ist. Weil Sie mit einem Leerzeichen eine Range übergeben. Siehe die letzte Zeile.

+0

hinzu Ich stimme Ihnen zu. Jedoch, in Ihrer 2. Reihe von Aussagen, nur "[1, 2] .include? (a: 1) 'veranschaulicht das Problem; die anderen verhalten sich identisch mit und ohne den Raum. (Die letzte Anweisung, die beispielsweise einen Bereich verwendet, gibt false mit oder ohne Leerzeichen zurück.). BTW, hier ist ein Beispiel dafür, wie sich das Verhalten mit und ohne Leerzeichen unterscheidet: https://gist.github.com/keithrebennett/be8f16f06612603fc352fa0c37d86d53. –

+0

Genau. Wie Sie sehen können, gibt es rechts von jeder Aussage einen Rückgabewert, der anzeigt, welche Aussage OK ist und welche nicht. Ich zeige diesen einen Fall, wenn der Dolmetscher nicht richtig "raten" kann. Andere Male kann es richtig erraten. – Uzbekjon

Verwandte Themen