2016-07-10 8 views
4

Als ich lief dies auf Rubin 2.3.1p112:Warum kann ich kein Standardargument rechts von einem Schwammargument verwenden?

def test(x, *y, z = 1) 
    puts x, y, z 
end 

ich diese Nachricht erhalten:

(repl):1: syntax error, unexpected '=', expecting ')' 
def test(x, *y, z = 1) 

von der anderen Seite, wenn ich die Position der Parameter y und z es funktioniert cahnge.

def test(x, z = 1, *y) 
    puts x, y, z 
end 

Warum ist es nicht möglich, diesen optionalen Parameter auf der rechten Seite des Schwammarguments zu verwenden?

Live-Code: https://repl.it/CaXU/2

Hinweis: Diese Frage unterscheidet sich von Optional argument after splat argument weil diese Frage zu einem Hash optionalen Parameter fragen, während dieses für einen einfachen nicht-Hash optional Paramenter fragen. Wenn es ein optionales Hash-Argument ist, gibt es keine Möglichkeit zu wissen, wie viele Argumente dem Hash und dem Schwamm-Argument zugewiesen werden. Im Fall eines optionalen Parameters, der kein Hash ist, wäre es jedoch sinnvoll, ein Element dem optionalen Parameter und den Rest dem Schwammargument zuzuordnen.

+0

Wir brauchen mehr Informationen. Welche Version von Ruby laufen Sie? Bitte lesen Sie "[fragen]" einschließlich der verlinkten Seiten und "[mcve]". –

+0

Danke @theTinMan. Ich habe die Frage modifiziert, indem ich die Ruby-Version und einen Live-Code-Link hinzugefügt habe. –

+3

Ich denke du meinst "splat", obwohl "sponge" nicht ohne Reiz ist. –

Antwort

0

Ruby erlaubt keine Mehrdeutigkeit. Solche Fälle werden syntaktisch ausgeschlossen. Wenn Sie zwei Argumente übergeben, wie würde es dann wissen, ob das zweite Argument Teil von y sein soll, ob nichts für z übergeben wird oder y leer sein sollte, wobei z das zweite Argument ist?

+0

Ich dachte das Gleiche. Aber wenn ich die Reihenfolge der y- und z-Parameter ändere, funktioniert es gut, selbst wenn es so aussehen könnte, habe ich dieselbe Ambiguität. Ich habe die ursprüngliche Frage mit diesen Informationen aktualisiert. –

Verwandte Themen