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.
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