ruby - vacio - ¿Comprobando si una variable está definida?
variable null javascript (14)
Además, puede verificar si está definido en una cadena a través de la interpolación, si codifica:
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
El sistema le dirá el tipo si está definido. Si no está definido, solo devolverá una advertencia que dice que la variable no está inicializada.
¡Espero que esto ayude! :)
¿Cómo puedo verificar si una variable está definida en Ruby? ¿Hay un método de tipo isset
disponible?
Aquí hay un código, nada de ciencia espacial, pero funciona lo suficientemente bien.
require ''rubygems''
require ''rainbow''
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined/n".color(:red)
else
print "car is defined/n".color(:green)
end
Claramente, el código para colorear no es necesario, solo una buena visualización en este ejemplo de juguete.
Como muchos otros ejemplos muestran, en realidad no se necesita un booleano de un método para hacer elecciones lógicas en ruby. Sería una mala forma coaccionar todo a un booleano a menos que realmente necesite un booleano.
Pero si absolutamente necesitas un booleano. Utilizar !! (bang bang) o "falsy falsy revela la verdad".
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
¿Por qué no suele pagar para coaccionar?
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
Aquí hay un ejemplo donde importa porque se basa en la coerción implícita del valor booleano a su representación de cadena.
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
Debe mencionarse que el uso defined
para verificar si un campo específico está configurado en un hash podría comportarse de forma inesperada:
var = {}
if defined? var[''unknown'']
puts ''this is unexpected''
end
# will output "this is unexpected"
La sintaxis es correcta aquí, pero defined? var[''unknown'']
defined? var[''unknown'']
se evaluará según la cadena "method"
, por lo que se ejecutará el bloque if
edición: la notación correcta para verificar si existe una clave en un hash sería:
if var.key?(''unknown'')
Esta es la respuesta clave: la definida? método. La respuesta aceptada de arriba ilustra esto perfectamente.
Pero hay un tiburón, acechando bajo las olas ...
Considere este tipo de patrón de rubí común:
def method1
@x ||= method2
end
def method2
nil
end
Paremos y pensemos en esto por un segundo. Método 2 siempre devuelve nil. La primera vez que llama a method1, la variable @x no está establecida, por lo tanto se ejecutará method2. y el método 2 establecerá @x en nil. Eso está bien, y todo muy bien. Pero, ¿qué pasa la segunda vez que llamas method1?
Recuerda que @x ya se ha establecido en nulo. Pero el método 2 todavía se ejecutará de nuevo? Si method2 es una empresa costosa, puede que no sea lo que quieres.
Dejemos lo definido? método de venir al rescate
def method1
return @x if defined? @x
@x = method2
end
Si no sabías sobre ese truco, entonces "vas a necesitar un bote más grande".
Esto es útil si no quiere hacer nada si existe, pero créelo si no existe.
def get_var
@var ||= SomeClass.new()
end
Esto solo crea la nueva instancia una vez. Después de eso solo sigue devolviendo la var.
La sintaxis correcta para la declaración anterior es:
if (defined?(var)).nil? # will now return true or false
print "var is not defined/n".color(:red)
else
print "var is defined/n".color(:green)
end
sustituyendo ( var
) con su variable. Esta sintaxis devolverá un valor verdadero / falso para la evaluación en la sentencia if.
Prueba "menos" en lugar de "si"
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
Puedes probar:
unless defined?(var)
#ruby code goes here
end
=> true
Porque devuelve un booleano.
Tenga en cuenta la distinción entre "definido" y "asignado".
$ ruby -e ''def f; if 1>2; x=99; end;p x, defined? x; end;f''
nil
"local-variable"
x se define aunque nunca se asigna!
Uso defined? YourVariable
defined? YourVariable
Mantenlo simple tonto ..;)
Utiliza el defined?
palabra clave ( documentation ). Devolverá una Cadena con el tipo de elemento, o nil
si no existe.
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
Como comentó skalee: "Vale la pena señalar que la variable que se establece en cero se inicializa".
>> n = nil
>> defined? n
=> "local-variable"
defined?(your_var)
funcionará. Dependiendo de lo que estés haciendo, también puedes hacer algo como your_var.nil?
defined?
es genial, pero si se encuentra en un entorno Rails, también puede usar try
, especialmente en los casos en los que desea verificar un nombre de variable dinámica:
foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo) # => 1
try(:bar) # => nil
try(my_foo) # => 1
try(my_bar) # => nil