Comment puis-je vérifier si une variable est définie dans Ruby? Existe-t-il une isset
méthode de type disponible?
ruby
reflection
Lecture seulement
la source
la source
nil
est initialisée.||=
opérateur) ci-dessous.defined?
renvoie toujours vrai pour une variable définie dans ce bloc!defined?
celle -là qui retourne booléen?!!defined?(object_name)
Ceci est utile si vous ne voulez rien faire s'il existe mais le créer s'il n'existe pas.
Cela ne crée la nouvelle instance qu'une seule fois. Après cela, il continue de renvoyer la var.
la source
||=
avec des valeurs booléennes, de peur de ressentir la douleur de la confusion.nil
à moins que vous ne vouliez vraiment évaluer l'expression chaque fois qu'elle est appelée quand elle revientnil
var = (var or var.nil?)
La syntaxe correcte pour l'instruction ci-dessus est:
en remplaçant (
var
) par votre variable. Cette syntaxe renverra une valeur vraie / fausse pour évaluation dans l'instruction if.la source
defined?(var) == nil
?.nil?
est plus idiomatique, comme on dit. Il est plus "orienté objet" de demander à un objet s'il l'est plutôtnil
que d'utiliser un opérateur de comparaison. Aucun n'est difficile à lire, alors utilisez celui qui vous aide à expédier plus de produits.defined?(your_var)
marchera. Selon ce que vous faites, vous pouvez également faire quelque chose commeyour_var.nil?
la source
your_var.nil?
car il renvoie vrai ou faux et est beaucoup plus agréable à lire et à écrire quedefined? var
. Merci pour cela.your_var.nil?
entraînera une erreur:undefined local variable or method your_var
lorsqu'il n'est pas défini avant ...Essayez "à moins que" au lieu de "si"
la source
Utilisez
defined? YourVariable
Keep it simple idiot ..;)
la source
Voici du code, rien de sorcier mais ça marche assez bien
De toute évidence, le code de coloration n'est pas nécessaire, juste une belle visualisation dans cet exemple de jouet.
la source
nil?
est facultatif.AVERTISSEMENT concernant un motif de rubis commun
C'est la réponse clé: la
defined?
méthode. La réponse acceptée ci-dessus illustre parfaitement cela.Mais il y a un requin qui se cache sous les vagues ...
Considérez ce type de motif rubis commun:
method2
revient toujoursnil
. La première fois que vous appelezmethod1
, la@x
variable n'est pas définie - ellemethod2
sera donc exécutée. etmethod2
se mettra@x
ànil
. C'est bien, et tout va bien. Mais que se passe-t-il la deuxième fois que vous appelezmethod1
?N'oubliez pas que @x a déjà été défini sur zéro.
But method2
sera toujours exécuté à nouveau !! Si la méthode 2 est une entreprise coûteuse, ce n'est peut-être pas quelque chose que vous souhaitez.Laissez la
defined?
méthode venir à la rescousse - avec cette solution, ce cas particulier est traité - utilisez ce qui suit:Le diable est dans les détails: mais vous pouvez échapper à ce requin qui se cache avec la
defined?
méthode.la source
Tu peux essayer:
Parce qu'il renvoie un booléen.
la source
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
déclaration semble trop compliquéComme de nombreux autres exemples le montrent, vous n'avez pas réellement besoin d'un booléen à partir d'une méthode pour faire des choix logiques en rubis. Ce serait une mauvaise forme de tout contraindre à un booléen, sauf si vous avez réellement besoin d'un booléen.
Mais si vous avez absolument besoin d'un booléen. Utilisation !! (bang bang) ou "falsy falsy révèle la vérité".
Pourquoi il n'est généralement pas avantageux de contraindre:
Voici un exemple où cela est important car il repose sur la contrainte implicite de la valeur booléenne à sa représentation sous forme de chaîne.
la source
Il convient de mentionner que l’utilisation de
defined
pour vérifier si un champ spécifique est défini dans un hachage peut se comporter de manière inattendue:La syntaxe est correcte ici, mais
defined? var['unknown']
sera évaluée dans la chaîne"method"
, donc leif
bloc sera exécutéedit: La notation correcte pour vérifier si une clé existe dans un hachage serait:
la source
Veuillez noter la distinction entre "défini" et "attribué".
x est défini même s'il n'est jamais attribué!
la source
NameError Exception: undefined local variable or method
et j'étais confus quand la seule affectation / mention de la variable était dans un bloc if qui n'était pas touché.En outre, vous pouvez vérifier s'il est défini dans une chaîne via une interpolation, si vous codez:
Le système vous indiquera le type s'il est défini. S'il n'est pas défini, il renverra simplement un avertissement indiquant que la variable n'est pas initialisée.
J'espère que cela t'aides! :)
la source
defined?
est génial, mais si vous êtes dans un environnement Rails, vous pouvez également l'utilisertry
, en particulier dans les cas où vous souhaitez vérifier un nom de variable dynamique:la source