2013-02-05 14 views
7

Ich weiß, dass viele Ruby-Style-Guides auf Klammern um Methodenargumente für Methodendefinitionen bestehen. Und ich verstehe, wie Klammern manchmal syntaktisch für Methodenaufrufe benötigt werden.Ruby-Klammern um Argumente in einer Methodendefinition

Aber kann jemand bieten als Beispiel dafür, warum Ruby-jemals Bedürfnisse Klammern um Argumente für eine Methodendefinition? Grundsätzlich suche ich nach einem Grund neben "es sieht besser aus".

+2

'def a (b) Ende' sonst würden Sie ein Semikolon brauchen – MarcDefiant

Antwort

-2

Ein anderes Beispiel ist, wenn Sie einen Hash als Argument wie zu

Diese Arbeit übergeben möchten nicht:

MyTable.update_all { col_a: 1, col_b: 2 } 

weil die {} für einen Block ist eher als ein Hash-

Hinzufügen der Parens funktioniert.

MyTable.update_all({ col_a: 1, col_b: 2 }) 

Im Fall von update_all dauert es bis 3 Hashes als Argumente auf, so ist es wichtig, um anzuzeigen, welche in die Hash-Werte gehen.

+0

Das funktioniert auch: MyTable.update_all (col_a: 1, col_b: 2) – psparrow

+0

Warum wurde das heruntergeregelt? Ist es falsch? – BalinKingOfMoria

+0

OP fragte nach Methodendefinitionen, daher ist die Antwort off-topic. – johncip

16

Wenn Sie weder Klammern noch ein Semikolon as pointed out in this comment hätten, wäre das mehrdeutig.

def foo a end # => Error because it is amgiguous. 
# Is this a method `foo` that takes no argument with the body `a`, or 
# Is this a method `foo` that takes an argument `a`? 

Auch wenn Sie zusammengesetzte Argumente verwenden möchten, können Sie die Klammern nicht auslassen:

def foo(a, b), c 
    p [a, b, c] 
end 
# => Error 

def foo((a, b), c) 
    p [a, b, c] 
end 
foo([1, 2], 3) # => [1, 2, 3] 
+1

Dies ist die erste legit Antwort auf einen Grund, warum es erforderlich sein kann. Ich denke, dass eine Ein-Linien-Methode es offensichtlich braucht (ich benutze sie nie), und die Verwendung eines Arrays und der ersten beiden Elemente ist etwas, das ich noch nie gesehen habe. Ich könnte nicht einmal nach einer Definition googlen, aber es funktioniert! Es heißt, nehmen Sie die ersten beiden Elemente wenn ein Array und in a und b, oder setzen Sie den Wert in a und nil in b. Es ist wie das Spiegeläquivalent des Splat. Irgendwelche URL zu dieser? – justingordon

0

Die häufigste Form, wenn die Klammern um Methodendefinition Argumente erforderlich sind, ist die verschachtelte Methodenaufruf des Formulars

foo g x,y 

, die übersetzt werden kann:

foo(g(x,y)) 

Da der Code jedoch als foo(g(x),y) interpretiert werden kann, gibt der Ruby eine Warnung aus (* die Warnung wurde in Ruby 1,9 entfernt).

Ein weiterer Fall, in dem Ruby eine Warnung ausgibt, ist der Fall, wenn mehr als ein Argument definiert ist.

Eine weitere Mehrdeutigkeitssituation ist der Fall, wenn Sie die Methode mit Klammern, jedoch mit einem Leerzeichen zwischen Methodennamen und Argumenten, aufrufen.

Nehmen Sie zum Beispiel:

square (2+2) * 2 # => square (4) * 2 => foo (8) = 64 
square(2+2) * 2 # => square(4) * 2 => 16 * 2= 32 

Als Folge der vorangehenden man das folgende Beispiel nehmen:

puts(square 2, 2) 

Dies kann als puts(square(2), 2)puts(square(2,2)) oder interpretiert werden.

Fazit: Seien Sie vorsichtig, wenn Sie Methoden ohne Klammern aufrufen und definieren.

+0

Das ist wenn man anruft und es macht sehr viel Sinn parens zu schreiben, wann immer es mehrdeutig sein kann. Die Frage bezieht sich auf Definitionen, die nicht aufgerufen werden. aber gute Antwort! – justingordon

+0

Frage war nicht über Methodenaufruf; In der Tat betont das OP, dass sie nicht danach fragen. – Divide

Verwandte Themen