web-dev-qa-db-fra.com

Vérifier si l'objet Ruby est un booléen

Je n'arrive pas à trouver comment vérifier si un objet est facilement un booléen. Y a-t-il quelque chose comme ça en Ruby?

true.is_a?(Boolean)
false.is_a?(Boolean)

En ce moment, je le fais et j'aimerais le raccourcir:

some_var = Rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
112
Lance Pollard

Le moyen le plus simple auquel je puisse penser:

# checking whether foo is a boolean
!!foo == foo
122
Konstantin Haase

Je trouve cela concis et auto-documenté:

[true, false].include? foo

Si vous utilisez Rails ou ActiveSupport, vous pouvez même effectuer une requête directe en utilisant in?

foo.in? [true, false]

La vérification de toutes les valeurs possibles n'est pas recommandée pour les flottants, mais elle est réalisable lorsqu'il n'y a que deux valeurs possibles!

87
mahemoff

Il n'y a pas de classe Boolean dans Ruby, la seule façon de vérifier consiste à faire ce que vous faites (en comparant l'objet à true et false ou la classe de l'objet à TrueClass et FalseClass). Vous ne savez pas pourquoi vous auriez besoin de cette fonctionnalité, pouvez-vous expliquer? :)

Si vous vraiment avez besoin de cette fonctionnalité, vous pouvez la pirater:

module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end

true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true
83
horseyguy

Comme indiqué ci-dessus, il n’existe pas de classe booléenne mais uniquement TrueClass et FalseClass. Toutefois, vous pouvez utiliser n’importe quel objet comme sujet de if /

Les tests booléens renvoient une instance de FalseClass ou TrueClass

(1 > 0).class #TrueClass

Le monkeypatch suivant à l'objet vous dira s'il s'agit d'une instance de TrueClass ou de FalseClass.

class Object
  def boolean?
    self.is_a?(TrueClass) || self.is_a?(FalseClass) 
  end
end

L'exécution de tests avec irb donne les résultats suivants

?> "String".boolean?
=> false
>> 1.boolean?
=> false
>> Time.now.boolean?
=> false
>> nil.boolean?
=> false
>> true.boolean?
=> true
>> false.boolean?
=> true
>> (1 ==1).boolean?
=> true
>> (1 ==2).boolean?
=> true
22
Steve Weet

Si votre code peut raisonnablement être écrit comme une déclaration de cas, ceci est plutôt décent:

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end
13
Henrik N

Un objet qui est un booléen aura soit une classe TrueClass, soit FalseClass. La ligne suivante devrait donc faire l'affaire.

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

Ce qui suit vous donnerait également un résultat vrai/faux de contrôle de type booléen

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true
5
user1966234

Alors essayez cette note (x == true) ^ (x == false) vous avez besoin de la parenthèse, mais celle-ci est plus belle et plus compacte.

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)

Note: Voir que c'est tellement basique que vous pouvez l'utiliser dans d'autres langues aussi, cela ne fournit pas une "chose est booléenne".

Note 2: Vous pouvez aussi utiliser ceci pour dire que chose est l'un de ??: "red", "green", "blue" si vous add more XORS... ou que cette chose est l'un de ??: 4, 5, 8, 35.

4
tyoc213

Non, pas comme si tu avais ton code. Il n'y a pas de 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 le booléen". C'est pourquoi vous avez eu les réponses que vous avez eues. Alors merci pour la question. Nourriture pour la pensée. Pourquoi Ruby n'a-t-il pas de classe booléenne?

NameError: uninitialized constant Boolean

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 parlez de types de données, c'est un peu impropre.

Essayez aussi Rand 2 car Rand 1 semble toujours donner 0. Rand 2 donnera 1 ou 0cliquez plusieurs fois ici . https://repl.it/IOPx/7

Bien que je ne sache pas comment m'y prendre pour faire un cours de booléen. Je l'ai expérimenté mais ...

class Boolean < TrueClass
  self
end

true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false

Au moins, nous avons ce cours maintenant, mais qui sait comment obtenir les bonnes valeurs?

0
Douglas G. Allen

Ce bijou ajoute une classe booléenne à Ruby avec des méthodes utiles.

https://github.com/RISCfuture/boolean

Utilisation:

require 'boolean'

Alors votre

true.is_a?(Boolean)
false.is_a?(Boolean)

fonctionnera exactement comme vous le souhaitez.

0
Convincible