¿Cuál es la sintaxis (=>) se utiliza en asignar objeto de error en la variable de "rescate" método?
-
13-12-2019 - |
Pregunta
El rescue
lo que podría asigna una variable para hacer referencia al objeto de error tiene esta sintaxis: (=>
)
rescue => e
Si rescue
es la una de la general de la llamada al método, ¿cuál es el significado de =>
.¿Puedo utilizar la misma sintaxis que en otra llamada de método?
my_method arg1, arg2 => my_obj
Solución
Mientras raise
es, de hecho, un método de, rescue
no es.Es una palabra clave, y se definen en analizar.y:10467.Como tal, la sintaxis que tiene es especial para rescue
(desde => e
no es cualquier tipo de método argumento), y no es válido para los métodos de sí mismos (al menos no con el mismo significado).Cómo/dónde la rescue => e
la sintaxis misma se define en el analizador no estoy del todo seguro.
Otros consejos
Como algunos entrenador de fútbol/rey-filósofo podría decir, es lo que es.Aquí está la de Ruby analizar.y.De particular interés es esta 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
;
Explicación
exc_list
básicamente permite la nada, un tipo de excepción, o un (splatted) serie de excepciones como la de rescue ZeroDivisionError, LoadError
exc_var
puede no ser nada o => some_variable
opt_rescue
por lo tanto se puede rescue
por sí mismo o más que uno o ambos de los de arriba.
Es sólo aparecen aquí como una sintaxis especial para la asignación de excepciones.El único otro uso para =>
es para clave-valor de la asociación de.
Tenga en cuenta también que arg_value
y mrhs
están en el lado izquierdo y lhs
es en el lado derecho, que es lo que puedo decir que el único lugar donde esto ocurre.Alguien me corrija si estoy equivocado aquí, pero no hay ninguna otra "hacia atrás" en la asignación de analizar.y.
No, la sintaxis en el rescate sólo se utiliza allí.Si utiliza el hash rocket '=>' en una llamada a una función como esta, será interpretado como un hash, y si arg2 no se definió como una variable previamente, será un error.
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}