Question Vérifier si une variable est définie?


Comment puis-je vérifier si une variable est définie dans Ruby? Y'a-t-il un issetméthode de type disponible?


534
2017-11-13 23:14


origine


Réponses:


Utilisez le defined? mot-clé (Documentation). Il retournera une chaîne avec le type de l'objet, ou nil si ça n'existe pas.

>> a = 1
 => 1
>> defined? a
 => "local-variable"
>> defined? b
 => nil
>> defined? nil
 => "nil"
>> defined? String
 => "constant"
>> defined? 1
 => "expression"

Comme Skalee a commenté: "Il est intéressant de noter que la variable qui est définie à zéro est initialisée."

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

742
2017-11-13 23:22



C'est utile si vous ne voulez rien faire s'il existe, mais créez-le s'il n'existe pas.

def get_var
  @var ||= SomeClass.new()
end

Cela crée uniquement la nouvelle instance une fois. Après cela, il ne fait que retourner le var.


90
2017-11-13 23:23



La syntaxe correcte pour l'instruction ci-dessus est:

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

substituant (var) avec votre variable. Cette syntaxe renverra une valeur true / false pour l'évaluation dans l'instruction if.


68
2018-05-27 12:54



defined?(your_var) marchera. En fonction de ce que vous faites, vous pouvez aussi faire quelque chose comme your_var.nil?


18
2017-11-13 23:18



Essayez "à moins" au lieu 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



Utilisation defined? YourVariable
Gardez-le simple idiot ..;)


9
2018-04-26 14:30



Tu peux essayer:

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

Parce qu'il renvoie un booléen.


5
2018-03-15 22:00



Voici du code, rien de scientifique mais ça marche assez 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

Clairement, le code de coloration n'est pas nécessaire, juste une belle visualisation dans cet exemple de jouet.


5
2017-09-16 07:52



C'est la réponse clé: le défini? méthode. La réponse acceptée ci-dessus illustre parfaitement cela.

Mais il y a un requin, caché sous les vagues ...

Considérez ce type de motif rubis commun:

 def method1
    @x ||= method2
 end

 def method2
    nil
 end

Arrêtons-nous et réfléchissons à cela pendant une seconde. La méthode 2 renvoie toujours zéro. La première fois que vous appelez method1, la variable @x n'est pas définie. Par conséquent, la méthode 2 sera exécutée. et la méthode 2 mettra @x à zéro. C'est bien, et tout va bien. Mais que se passe-t-il la deuxième fois que vous appelez method1?

Souvenez-vous que @x a déjà été défini sur zéro. Mais la méthode 2 sera encore exécutée? Si la méthode 2 est une entreprise coûteuse, ce n'est peut-être pas ce que vous voulez.

Laisser le défini? méthode venir à la rescousse

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

Si vous ne connaissiez pas ce truc, eh bien, vous aurez besoin d'un plus gros bateau.


4
2017-07-08 03:31