¿Cómo puedo verificar si una variable está definida en Ruby? ¿Hay un isset
método de tipo disponible?
ruby
reflection
Solo lectura
fuente
fuente
nil
se inicializa.||=
operador) a continuación.defined?
aún se devuelve verdadero para una variable definida dentro de ese bloque!defined?
ese devuelve boolean?!!defined?(object_name)
Esto es útil si no desea hacer nada si existe, sino crearlo si no existe.
Esto solo crea la nueva instancia una vez. Después de eso, simplemente sigue devolviendo la var.
fuente
||=
con valores booleanos, para que no sienta el dolor de la confusión.nil
así a menos que realmente desea evaluar la expresión cada vez que se llama cuando se hace el retornonil
var = (var or var.nil?)
La sintaxis correcta para la declaración anterior es:
sustituyendo (
var
) con su variable. Esta sintaxis devolverá un valor verdadero / falso para la evaluación en la instrucción if.fuente
defined?(var) == nil
?.nil?
es más idiomático, como dicen. Es más "orientado a objetos" preguntarle a un objeto si esnil
que usar un operador de comparación. Ninguno de los dos es difícil de leer, así que use el que le ayude a enviar más productos.defined?(your_var)
trabajará. Dependiendo de lo que estés haciendo, también puedes hacer algo comoyour_var.nil?
fuente
your_var.nil?
porque devuelve verdadero de falso y es mucho más agradable de leer y escribir quedefined? var
. Gracias por esto.your_var.nil?
producirá un error:undefined local variable or method your_var
cuando no se haya definido antes ...Intente "a menos que" en lugar de "si"
fuente
Use
defined? YourVariable
Keep it simple tonly ..;)
fuente
Aquí hay un código, nada de ciencia espacial pero funciona lo suficientemente bien
Claramente, el código de color no es necesario, solo una buena visualización en este ejemplo de juguete.
fuente
nil?
es opcional.ADVERTENCIA Re: Un patrón de rubí común
Esta es la respuesta clave: el
defined?
método. La respuesta aceptada arriba ilustra esto perfectamente.Pero hay un tiburón al acecho debajo de las olas ...
Considere este tipo de patrón de rubí común:
method2
siempre vuelvenil
. La primera vez que llamamethod1
, la@x
variable no está establecida, pormethod2
lo tanto , se ejecutará. ymethod2
se establecerá@x
ennil
. Eso está bien, y todo bien y bien. ¿Pero qué pasa la segunda vez que llamasmethod1
?Recuerde que @x ya se ha establecido en nulo.
But method2
todavía se ejecutará de nuevo !! Si method2 es una tarea costosa, esto podría no ser algo que desee.Deje que el
defined?
método salga al rescate - con esta solución, se maneja ese caso particular - use lo siguiente:El diablo está en los detalles: pero puedes evadir a ese tiburón al acecho con el
defined?
método.fuente
Puedes probar:
Porque devuelve un valor booleano.
fuente
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
declaración parece demasiado complicadoComo muchos otros ejemplos muestran, en realidad no necesita un booleano de un método para tomar decisiones lógicas en ruby. Sería una forma deficiente obligar todo a un booleano a menos que realmente necesite un booleano.
Pero si absolutamente necesitas un booleano. Utilizar !! (bang bang) o "falso falso revela la verdad".
Por qué no suele pagar coaccionar:
Aquí hay un ejemplo donde importa porque se basa en la coerción implícita del valor booleano a su representación de cadena.
fuente
Cabe mencionar que usar
defined
para verificar si un campo específico está configurado en un hash podría comportarse de manera inesperada:La sintaxis es correcta aquí, pero
defined? var['unknown']
se evaluará en la cadena"method"
, por lo queif
que se ejecutará bloqueeditar: La notación correcta para verificar si existe una clave en un hash sería:
fuente
Tenga en cuenta la distinción entre "definido" y "asignado".
¡x se define aunque nunca se asigne!
fuente
NameError Exception: undefined local variable or method
, y estaba confundido cuando la única asignación / mención de la variable estaba en un bloque if que no estaba siendo golpeado.Además, puede verificar si está definido mientras está en una cadena a través de la interpolación, si codifica:
El sistema le dirá el tipo si está definido. Si no está definido, solo devolverá una advertencia diciendo que la variable no está inicializada.
¡Espero que esto ayude! :)
fuente
defined?
es genial, pero si está en un entorno Rails, también puede usarlotry
, especialmente en los casos en que desea verificar un nombre de variable dinámica:fuente