web-dev-qa-db-ja.com

ブール値を整数に変換するにはどうすればよいですか?

Trueかどうかを確認するブール値があり、ローカル変数を設定します。 Rubyっぽくするために、これをどのようにリファクタリングしますか?

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

ある時点でそれを持っている場合は 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_。次に、このようにすることは理にかなっています。

16
sawa

別の選択肢は、短絡演算子の使用です。

inflection_point && 1 || 0


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

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
6
Jörg W Mittag

必要なのは、3項演算子として知られている条件付き演算です。これはほとんどすべての言語で使用され、記号を使用しますか?と:

inflection_point = firm.inflection_point ? 1 : 0

基本的に、最初の条件がtrue(firm.inflection_point)と評価された場合、「?」の後に値を返します(1)それ以外の場合は、 ":"の後の値を返します(0)

4
thebugfinder

ここに別の方法があります:

5 - bool.to_s.length

これは、'true'は4文字ですが、'false'には5があります。

1
Darth Egregious

純粋なRubyソリューションではありませんが、ActiveRecord::Type::Integer.new.cast(true)を使用できます

1