Pregunta Verificando si una variable está definida?


¿Cómo puedo verificar si una variable está definida en Ruby? Hay un issettipo de método disponible?


534
2017-11-13 23:14


origen


Respuestas:


Utilizar el defined? palabra clave (documentación) 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 Skalee comentó: "Vale la pena señalar que la variable que se establece en cero se inicializa".

>> n = nil  
>> defined? n
 => "local-variable"

742
2017-11-13 23:22



Esto es útil si no desea 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.


90
2017-11-13 23:23



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 tu variable. Esta sintaxis devolverá un valor verdadero / falso para la evaluación en la sentencia if.


68
2018-05-27 12:54



defined?(your_var) trabajará. Dependiendo de lo que estés haciendo, también puedes hacer algo como your_var.nil?


18
2017-11-13 23:18



Pruebe "a 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

15
2018-04-06 20:42



Utilizar defined? YourVariable
Que sea simple tonto ..;)


9
2018-04-26 14:30



Puedes probar:

unless defined?(var)
  #ruby code goes here
end
=> true

Porque devuelve un booleano.


5
2018-03-15 22:00



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 de coloración no es necesario, solo una buena observación en este ejemplo de juguete.


5
2017-09-16 07:52



Esta es la respuesta clave: ¿definido? método. La respuesta aceptada 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

Vamos a parar y pensar en esto por un segundo. el método 2 siempre devuelve nil. La primera vez que llama al método 1, la variable @x no está configurada; por lo tanto, se ejecutará el método2. y el método 2 establecerá @x a nil. Eso está bien, y todo está bien. Pero, ¿qué ocurre la segunda vez que llamas a method1?

Recuerde que @x ya se ha establecido en cero. Pero el método 2 todavía se ejecutará de nuevo? Si method2 es una empresa costosa, esto podría no ser algo que desee.

Deje lo definido? método viene al rescate

  def method1
    return @x if defined? @x
    @x = method2
  end

Si no sabías sobre ese truco, entonces "vas a necesitar un barco más grande".


4
2017-07-08 03:31



Como muchos otros ejemplos muestran que en realidad no necesita un booleano de un método para realizar elecciones lógicas en ruby. Sería una forma pobre forzar todo a un booleano a menos que realmente necesite un booleano.

Pero si necesitas absolutamente 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 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

3
2018-01-08 12:07