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
inflection_point = (firm.inflection_point ? 1 : 0)
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.
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
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
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)
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.
Ce n'est pas pur Ruby solution mais, vous pouvez utiliser ActiveRecord::Type::Integer.new.cast(true)