Qual è la sintassi (=>) utilizzata per assegnare l'oggetto errore alla variabile del metodo "rescue"?

StackOverflow https://stackoverflow.com//questions/9686991

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
È stato utile?

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 .

Nota Anche che arg_value e mrhs sono sul lato sinistro e lhs è sul lato destro, che è il più lontano possibile da dire l'unico posto in cui ciò si verifica. Qualcuno mi corregge se mi sbaglio qui, ma non c'è nessun altro incarico "all'indietro" in Parse.y.

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}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top