Hai due problemi.
Lo spazio tra puts
e (
impedisce la tupla venga interpretato come una lista di argomenti. Dopo aver inserito uno spazio dopo il nome di un metodo, qualsiasi elenco di argomenti deve essere al di fuori delle parentesi e qualsiasi parte tra parentesi deve essere un'espressione legale. In Ruby, (x,y,z)
non è una singola espressione legale, quindi ottieni l'errore sopra riportato.
Se si rimuove lo spazio, si ottiene questo:
> puts(x, y = 1, 2)
NameError: undefined local variable or method `x' for main:Object
Questo è a causa del vostro secondo problema:
La dichiarazione puts(x,y = 1,2)
viene analizzato come puts(x, y=1, 2)
; cioè, Ruby lo interpreta come passare tre argomenti a puts
: x
è il primo, y=1
è il secondo e 2
è il terzo. Poiché lo x
non si trova sul lato sinistro di un compito e non è ancora stato definito, si ottiene l'errore sopra riportato.
Utilizzare un ulteriore set di parentesi per raggruppare l'intera assegnazione insieme come un solo argomento:
> puts((x,y=1,2))
1
2
Ma si noti che questo è il passaggio un unico elenco che contiene due elementi. Non fare la differenza con puts
, ma sarà per i metodi che distinguono tra liste e singoli parametri:
> def foo(a,b) puts "a=#{a},b=#{b}" end
> foo((x,y=1,2))
ArgumentError: wrong number of arguments (1 for 2)
Quindi, in questo caso avete bisogno di un altro pezzo di punteggiatura - l'operatore splat:
> foo(*(x,y=1,2))
a=1, b=2
Interessante, ma di scarsa rilevanza pratica, è il fatto che una volta che hai raddoppiato le parentesi, si può mettere lo spazio posteriore, se si desidera:
> puts ((x, y = 1, 2))
1
2
Ma di nuovo, questo li trasforma da wrapper di argomenti in un semplice wrapper di espressioni; puoi mettere un numero qualsiasi di parentesi intorno a quello senza cambiare nulla.Ciò significa che nel caso foo
, l'operatore splat deve andare al di fuori entrambi i gruppi di parentesi:
> foo (*(x,y=1,2))
SyntaxError: (irb):24: syntax error, unexpected tSTAR
> foo *((x,y=1,2))
a=1, b=2
E 'generalmente considerato cattivo stile in Ruby usare la forma parenthesisless quando il primo argomento in sé include parentesi, però. A seconda della versione di Ruby, è possibile che venga visualizzato un avviso su tali istruzioni, ma anche in caso contrario, è preferibile utilizzare la versione completamente con parentesi (senza spazio dopo il nome del metodo).
provare senza lo spazio 'puts (x, y = 1,2)' – tihom
puts ((a, b = 1, 2)) –
Per favore, stand - e non mettere spazi prima delle parentesi argomento, per favore - matz. .. [ref] (http://www.justskins.com/forums/ruby-1-8-space-122361.html) – tihom