Je n'arrive pas à vérifier si un objet est un booléen facilement. Y a-t-il quelque chose comme ça dans Ruby?
true.is_a?(Boolean)
false.is_a?(Boolean)
En ce moment, je fais ceci et je voudrais le raccourcir:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
la source
la source
Réponses:
Le moyen le plus simple auquel je puisse penser:
la source
Je trouve cela concis et auto-documenté:
Si vous utilisez Rails ou ActiveSupport, vous pouvez même effectuer une requête directe en utilisant
in?
La vérification par rapport à toutes les valeurs possibles n'est pas quelque chose que je recommande pour les flottants, mais c'est faisable lorsqu'il n'y a que deux valeurs possibles!
la source
foo == true or foo == false
que quelqu'un mette un commentaire.!!foo == foo
.Il n'y a pas de
Boolean
classe dans Ruby, la seule façon de vérifier est de faire ce que vous faites (comparer l'objet avectrue
etfalse
ou la classe de l'objet avecTrueClass
etFalseClass
). Vous ne savez pas pourquoi vous auriez besoin de cette fonctionnalité, pouvez-vous expliquer? :)Si vous avez vraiment besoin de cette fonctionnalité, vous pouvez la pirater dans:
la source
expect(some_method?(data)).to be_a(Boolean)
"quotes"
mais pas de nombres et de booléensComme indiqué ci-dessus, il n'y a pas de classe booléenne juste TrueClass et FalseClass, mais vous pouvez utiliser n'importe quel objet comme sujet de if / sauf et tout est vrai sauf les instances de FalseClass et nil
Les tests booléens retournent une instance de FalseClass ou TrueClass
Le monkeypatch suivant à Object vous dira si quelque chose est une instance de TrueClass ou FalseClass
L'exécution de certains tests avec irb donne les résultats suivants
la source
self == true or self == false
. Ce sont les seules instances de TrueClass et FalseClass.boolean
, une pour TrueClass / FalseClass et une pour Object.Time#==
dans Ruby 1.8 fait qu'une comparaison avec des valeurs non-Time renvoie nil plutôt que faux.Si votre code peut raisonnablement être écrit comme une déclaration de cas, c'est assez décent:
la source
Un objet qui est un booléen aura soit une classe de TrueClass ou FalseClass donc le one-liner suivant devrait faire l'affaire
Ce qui suit vous donnera également un résultat de vérification de type booléen vrai / faux
la source
Alors essayez cette
(x == true) ^ (x == false)
note, vous avez besoin de la parenthèse mais c'est plus beau et compact.Il passe même le suggéré comme "cuak" mais pas un "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Remarque : voyez que c'est tellement basique que vous pouvez aussi l'utiliser dans d'autres langues, cela ne fournit pas de "chose est booléenne".
Note 2 : Vous pouvez également utiliser ceci pour dire que la chose est l'une des ??:
"red", "green", "blue"
si vousadd more XORS
... ou dites que cette chose est l'une des ??:4, 5, 8, 35
.la source
Ce bijou ajoute une classe booléenne à Ruby avec des méthodes utiles.
https://github.com/RISCfuture/boolean
Utilisation:
Alors votre
fonctionnera exactement comme vous le souhaitez.
la source
Non, pas comme si vous aviez votre code. Il n'y a aucune classe nommée Boolean. Maintenant, avec toutes les réponses que vous avez, vous devriez pouvoir en créer une et l'utiliser. Vous savez comment créer des classes, n'est-ce pas? Je ne suis venu ici que parce que je me demandais moi-même cette idée. Beaucoup de gens pourraient dire "Pourquoi? Vous devez simplement savoir comment Ruby utilise Boolean". C'est pourquoi vous avez obtenu les réponses que vous avez faites. Alors merci pour la question. Nourriture pour la pensée. Pourquoi Ruby n'a-t-il pas de classe booléenne?
Gardez à l'esprit que les objets n'ont pas de types. Ce sont des classes. Les objets ont des données. C'est pourquoi, lorsque vous dites les types de données, c'est un peu un abus de langage.
Essayez aussi rand 2 car rand 1 semble toujours donner 0. rand 2 donnera 1 ou 0 clic plusieurs fois ici. https://repl.it/IOPx/7
Bien que je ne sache pas comment faire moi-même une classe booléenne. Je l'ai expérimenté mais ...
Au moins, nous avons cette classe maintenant, mais qui sait comment obtenir les bonnes valeurs?
la source