web-dev-qa-db-fra.com

Comment convertir des valeurs booléennes en entiers?

J'ai une valeur booléenne pour vérifier si elle est vraie, puis définissez une variable locale. Comment refactoriser cela pour qu'il soit plus Ruby-ish?

if firm.inflection_point
  inflection_point = 1
else
  inflection_point = 0
end
28
marcamillion
inflection_point = (firm.inflection_point ? 1 : 0)
60
rudolph9

Si vous avez juste cela à un moment donné, alors la réponse de rudolph9 est bon, mais si vous avez un genre similaire de logique partout, alors peut-être que cela pourrait avoir un sens avec une utilisation générale à l'esprit pour singe pièce:

class FalseClass; def to_i; 0 end end
class TrueClass; def to_i; 1 end end

inflection_point = firm.inflection_point.to_i

Dans Ruby, vous devez conserver toute votre logique traitant des valeurs de vérité plutôt que 0 et 1, mais je suppose que vous avez affaire à des entrées ou sorties de/vers un système externe qui traite 0 et 1. Ensuite, faire comme ça aura du sens.

16
sawa

Une autre alternative est l'utilisation d'opérateurs de court-circuit:

inflection_point && 1 || 0


irb(main):001:0> true && 1 || 0
=> 1
irb(main):002:0> false && 1 || 0
=> 0
11
Andre Figueiredo

En Ruby, if est une expression. Il n'est pas nécessaire d'affecter à une variable à l'intérieur des branches then et else, il suffit de renvoyer la valeur souhaitée et d'affecter la variable au résultat de la if expression:

inflection_point = if firm.inflection_point
  1
else
  0
end

Dans des cas simples comme celui-ci, il est plus lisible d'écrire l'expression entière sur une seule ligne:

inflection_point = if firm.inflection_point then 1 else 0 end

Vous pouvez également utiliser l'opérateur conditionnel, que je trouve personnellement beaucoup moins lisible:

inflection_point = firm.inflection_point ? 1 : 0
6
Jörg W Mittag

Ce dont vous avez besoin est une opération conditionnelle connue sous le nom d'opérateur ternaire. Elle est utilisée dans presque toutes les langues et utilise les symboles? et :

inflection_point = firm.inflection_point ? 1 : 0

signifie essentiellement, si la première condition est évaluée à true (firm.inflection_point), retourner la valeur après "?" (1) sinon, retournez la valeur après ":" (0)

4
thebugfinder

Voici une autre méthode:

5 - bool.to_s.length

Cela profite du fait que 'true' a quatre caractères, tandis que 'false' en a 5.

1
Darth Egregious

Ce n'est pas pur Ruby solution mais, vous pouvez utiliser ActiveRecord::Type::Integer.new.cast(true)

1
Mikołaj Wawrzyniak