616 votes

Vérifier si une variable est définie ?

Comment puis-je vérifier si une variable est définie en Ruby ? Existe-t-il un isset -disponible ?

822voto

Ricardo Acras Points 11194

Utilisez le defined? mot-clé ( documentation ). Elle renverra une chaîne de caractères avec le type de l'élément, ou nil s'il n'existe pas.

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

Comme l'a dit Skalee : "Il faut noter que la variable qui est mise à nil est initialisée".

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

94 votes

Il convient de noter que la variable qui a pour valeur nil est initialisé.

7 votes

Si vous voulez définir une variable si elle n'existe pas et la laisser tranquille si elle existe, voir la réponse de @danmayer (qui fait appel à la fonction ||= ) ci-dessous.

2 votes

Voici une autre bizarrerie que je peux rencontrer Si vous définissez une variable dans un bloc if dont la condition n'est jamais remplie, defined? retourne toujours vrai pour une variable définie dans ce bloc !

95voto

danmayer Points 2581

Ceci est utile si vous voulez ne rien faire s'il existe mais le créer s'il n'existe pas.

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

Cela ne crée la nouvelle instance qu'une seule fois. Après cela, elle continue à renvoyer la var.

9 votes

C'est aussi très idiomatique en Ruby et très typique, d'ailleurs.

0 votes

Merci pour cette contribution ! Je suis un débutant en ruby/rails et je suis tombé sur cette syntaxe hier soir, j'ai eu du mal à comprendre ce qu'elle signifiait. Cela semble très pratique !

39 votes

N'utilisez pas ||= avec des valeurs booléennes, de peur que vous ne ressentiez la douleur de la confusion.

71voto

foomip Points 521

La syntaxe correcte pour l'énoncé 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

en substituant ( var ) avec votre variable. Cette syntaxe renvoie une valeur vrai/faux à évaluer dans l'instruction if.

11 votes

Ce n'est pas nécessaire car nil vaut faux lorsqu'il est utilisé dans un test.

0 votes

Pourquoi pas ? defined?(var) == nil ?

0 votes

@vol7ron - Cette syntaxe est parfaitement valide. L'utilisation de l'appel à .nil? est plus idiomatique, comme on dit. C'est plus "orienté objet" de demander à un objet s'il est nil que d'utiliser un opérateur de comparaison. Ni l'un ni l'autre n'est difficile à lire, alors utilisez celui qui vous permet d'expédier plus de produits.

20voto

digitalsanctum Points 1937

defined?(your_var) fonctionnera. Selon ce que vous faites, vous pouvez aussi faire quelque chose comme your_var.nil?

0 votes

+1 pour your_var.nil? car il renvoie un vrai ou un faux et est beaucoup plus agréable à lire et à écrire que defined? var . Merci pour cela.

29 votes

your_var.nil? entraînera une erreur : undefined local variable or method your_var quand il n'a pas été défini auparavant...

16voto

user761856 Points 71

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

0 votes

Qu'est-ce que cette réponse ajoute qui n'a pas été dit par les autres réponses ?

2 votes

Cela répond très bien à la question d'une manière plus utile, n'est-ce pas ?

2 votes

Le guide de style ruby dit "Favoriser unless plutôt que if pour les conditions négatives". github.com/bbatsov/ruby-style-guide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X