2012-03-13 8 views
7

Il rescue che potrebbe assegna una variabile per fare riferimento all'oggetto errore ha questa sintassi (=>)Qual è la sintassi (=>) utilizzata nell'assegnare l'oggetto errore alla variabile del metodo `rescue`?

rescue => e 

Se rescue è quello del metodo chiamata generale, qual è il significato di =>. Posso usare la stessa sintassi su un'altra chiamata di metodo?

my_method arg1, arg2 => my_obj 
+3

Vuoi dire 'rescue => e'? 'raise => e' non è un Ruby valido. –

+0

Siamo spiacenti. 'rescue => e' – steveyang

+0

No, è un costrutto sintattico. Vedi http://stackoverflow.com/questions/9669128/ruby-rescue-like-syntax#comment12281753_9669128, mi chiedo perché questo venga chiesto all'improvviso. –

risposta

4

Mentre raise is indeed a method, rescue non è. È una parola chiave e definita su parse.y:10467. In quanto tale, la sintassi che si possiede è speciale per rescue (dal => e non è un tipo di argomento metodo) e non valido per i metodi stessi (almeno non con lo stesso significato). Come/dove la sintassi è definita nel parser non sono del tutto sicuro.

0

No, la sintassi del salvataggio viene utilizzata solo lì. Se si utilizza il razzo hash '=>' in una chiamata di funzione come quella, verrà interpretato come un hash, e se arg2 non è stato definito come una variabile in precedenza, sarà un errore.

def foo(a,b) 
    puts b.inspect 
end 

foo "bar", :baz => 5 #=> {:baz=>5} 

foo "bar", baz => 5 #=> NameError: undefined local variable or method `baz' 

baz = "flux" 

foo "bar", baz => 5 #=> {"flux"=>5} 
4

Come potrebbe dire qualche allenatore di calcio/re filosofo, è quello che è. Ecco Ruby's parse.y. Di particolare interesse è this part:

opt_rescue  : keyword_rescue exc_list exc_var then 
        compstmt 
        opt_rescue 
        ... 
       | none 
       ; 

exc_list  : arg_value 
        ... 
       | mrhs 
        ... 
       | none 
       ; 

exc_var   : tASSOC lhs 
        ... 
       | none 
       ; 

Spiegazione
exc_list permette praticamente nulla, un tipo di eccezione, o un (splatted) serie di eccezioni come rescue ZeroDivisionError, LoadError

exc_var può essere nulla o => some_variable

opt_rescue può quindi essere rescue da solo o più uno o entrambi i precedenti.

È solo elencato qui come sintassi speciale per l'assegnazione di eccezioni. L'unico altro uso per => è per key-value association.

Si noti inoltre che arg_value e mrhs sono sul lato sinistro e lhs si trova sul lato destro, che è quanto posso dire l'unico posto in cui ciò si verifica. Qualcuno mi corregga se sbaglio qui, ma non c'è nessun altro incarico "all'indietro" in parse.y.

+1

Gah Ho passato tutto questo e in qualche modo mi sono perso 'exc_var'. Buona scoperta –