Trueかどうかを確認するブール値があり、ローカル変数を設定します。 Rubyっぽくするために、これをどのようにリファクタリングしますか?
if firm.inflection_point
inflection_point = 1
else
inflection_point = 0
end
inflection_point = (firm.inflection_point ? 1 : 0)
ある時点でそれを持っている場合は rudolph9の答え が適切ですが、いたるところに同様の種類のロジックがある場合は、サルの一般的な使用を念頭に置いて意味があるかもしれませんパッチ:
_class FalseClass; def to_i; 0 end end
class TrueClass; def to_i; 1 end end
inflection_point = firm.inflection_point.to_i
_
Ruby内では、_0
_および_1
_ではなく真理値を処理するすべてのロジックを保持する必要がありますが、_0
_および_1
_。次に、このようにすることは理にかなっています。
別の選択肢は、短絡演算子の使用です。
inflection_point && 1 || 0
irb(main):001:0> true && 1 || 0
=> 1
irb(main):002:0> false && 1 || 0
=> 0
Rubyでは、if
は式です。 then
およびelse
ブランチ内の変数に割り当てる必要はありません。必要な値を返し、変数をif expression
の結果に割り当てるだけです。
inflection_point = if firm.inflection_point
1
else
0
end
このような単純なケースでは、式全体を1行で記述する方が読みやすくなります。
inflection_point = if firm.inflection_point then 1 else 0 end
条件演算子を使用することもできます。これは、私が個人的に読みにくくしていることがわかりました。
inflection_point = firm.inflection_point ? 1 : 0
必要なのは、3項演算子として知られている条件付き演算です。これはほとんどすべての言語で使用され、記号を使用しますか?と:
inflection_point = firm.inflection_point ? 1 : 0
基本的に、最初の条件がtrue(firm.inflection_point)と評価された場合、「?」の後に値を返します(1)それ以外の場合は、 ":"の後の値を返します(0)
ここに別の方法があります:
5 - bool.to_s.length
これは、'true'
は4文字ですが、'false'
には5があります。
純粋なRubyソリューションではありませんが、ActiveRecord::Type::Integer.new.cast(true)
を使用できます