Comment vous définissez une valeur de type boolean valeur par défaut en Ruby?
Pour d'autres types de variables, j'utilise ||=
, mais cela ne fonctionne pas pour les booléens (x ||= true
attribue x à vrai même si x a été précédemment attribué à false).
J'avais pensé que ce serait le travail:
x = true unless defined?(x)
Mais il n'a pas: il affecte à x à zéro pour une raison quelconque. (Une explication ici serait appréciée.)
Je connais une méthode qui fonctionne:
unless defined?(x)
x = true
end
Mais il est assez bavard. Est-il une manière plus concise pour attribuer des valeurs par défaut pour les variables booléennes en Ruby?
est-il une raison pourquoi vous ne voulez pas que x soit attribué à zéro (ce qui est équivalent à false pour toutes les intentions et buts) ?
Parce qu'il veut qu'il soit
À l'aide de néant au lieu de false est bien, mais il ne traite pas le problème avec
Parce qu'il veut qu'il soit
true
, pas falsey.À l'aide de néant au lieu de false est bien, mais il ne traite pas le problème avec
||=
. Si vous essayez d'attribuer une valeur par défaut de x à l'aide de ||=
, et x a été précédemment attribué à néant, elle sera remplacée plutôt que la conservation de la valeur de néant (depuis le néant est falsey).OriginalL'auteur evanrmurphy | 2012-11-09
Vous devez vous connecter pour publier un commentaire.
Vous devez avoir
defined?
première, d'autre l'analyseur atteintx =
et puis définit lesx
(ce qui les rendnil
) avant d'exécuter leunless
:Faire un
if
/unless
bloc (au lieu de post-if
/unless
one-liner) fonctionne également:Je savais que j'avais écrit quelque chose récemment sur ce sujet...
Merci, Andrew.
defined?(x) or x = true
fonctionne très bien.OriginalL'auteur Andrew Marshall
Il y a seulement deux non-vrai valeurs en Ruby:
false
etnil
. Tout ce que vous devez faire est de distinguer entre ceux-ci. Jusqu'à ce que le nouveau//=
opérateur qui effectue cette opération automatiquement vient autour, vous êtes coincé avec ce:Espérons que cela peut être abrégé dans les futures versions de ruby. 99% du temps, vous n'avez pas vraiment à propos de la différence entre les deux non-valeurs vraies, mais que 1% du temps vous le faites, cela devient ennuyeux d'avoir à être exceptionnellement détaillé.
Rappelez-vous que le
defined?
opérateur peut toujours revenir"local-variable"
pour cette condition parce que la variablex
est "défini" comme une variable locale. Le contraste avecdefined?(nope)
et vous obtiendreznil
parce que cette variable n'existe pas. Ruby est concerné avec la variable ou de la constante en question, pas si cette variable ou de la constante a été défini avec une valeur.x = true if x.nil?
, ce qui pour moi est plus lisible que le||=
idiome de toute façon!Je sais que cela peut sembler évident, mais vous devez avoir
x
quelque part dans votre code, carclass A; def self.check; if x.nil?; x = true; end; end; end; A.check;
sera de retour uneundefined local variable
exception.Selon le cotext de l'affiche, cela pourrait effectivement être faux. Si vous faites cela dans la CISR, il provoque un
undefined local variable
exception où, comme l'exemple de l'affiche n'est pas et ayants droitx = true
.Merci pour la réponse, mais votre exemple est bon seulement si x n'a pas été défini précédemment. Sinon, il échoue avec
NameError: undefined local variable or method 'x' for main:Object
. Dans mon cas, il est incertain si x sera défini précédemment, qui est pourquoi j'ai été vérifier avecdefined?
. Désolé si ce n'était pas clair dans la question.Ouais, vous devez définir les variables de quelque part avant de les utiliser. Il est préférable d'utiliser les variables d'instance comme
@x
qui ne peut pas ne pas exister.OriginalL'auteur tadman
x
êtrefalse
même si elle était déjàtrue
.as-tu veux dire que ce serait rendre les
x
êtretrue
même si elle était déjàfalse
?Oui, j'ai inversé les deux.
OriginalL'auteur vijikumar