Qual è la sintassi (=>) utilizzata per assegnare l'oggetto errore alla variabile del metodo "rescue"?
-
13-12-2019 - |
Domanda
IL rescue
che potrebbe assegnare una variabile per fare riferimento all'oggetto errore ha questa sintassi (=>
)
rescue => e
Se rescue
è quello della chiamata generale al metodo, qual è il significato di =>
.Potrei usare la stessa sintassi su un'altra chiamata di metodo?
my_method arg1, arg2 => my_obj
Soluzione
Mentre raise
è davvero un metodo, rescue
non è.È una parola chiave e definita su parse.y:10467.In quanto tale, la sintassi che hai è speciale rescue
(Da => e
non è una cosa del genere metodo argomento) e non validi per i metodi stessi (almeno non con lo stesso significato).Come/dove il rescue => e
la sintassi stessa è definita nel parser, non ne sono del tutto sicuro.
Altri suggerimenti
Come alcuni allenatori di calcio / Philosopher-King potrebbero dire, è quello che è. Ecco Ruby's analy.y . Di particolare interesse è Questa parte :
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
fondamentalmente non consente nulla, un tipo di eccezione o una serie (slattografica) di eccezioni come rescue ZeroDivisionError, LoadError
exc_var
non può essere nulla o => some_variable
opt_rescue
può quindi essere rescue
da solo o più o sia o entrambi i precedenti.
è solo elencato qui come sintassi speciale per l'assegnazione di eccezioni. L'unico altro uso per =>
è per Associazione del valore del tasto .
No, la sintassi in salvataggio viene utilizzata solo lì.Se si utilizza il razzo hash '=>' in una chiamata di funzione del genere, verrà interpretato come 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}
.