variable vacio saber quitar objeto esta error como ruby reflection

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