zがfalseの場合z
が真である、とx unless y
場合、私はx if y
を実行したいと思います。真理値に基づいて "if"や "unless"を行う慣用的なRubyの方法はありますか?
それを行うための最も慣用的な方法は何ですか?私が思い付くことができる最高は次のようになります。これは、ブール値に強制変換するための標準的なRubyのイディオムである
x if !!y == !!z
:
x if z ? y : !y
zがfalseの場合z
が真である、とx unless y
場合、私はx if y
を実行したいと思います。真理値に基づいて "if"や "unless"を行う慣用的なRubyの方法はありますか?
それを行うための最も慣用的な方法は何ですか?私が思い付くことができる最高は次のようになります。これは、ブール値に強制変換するための標準的なRubyのイディオムである
x if !!y == !!z
:
x if z ? y : !y
はこれを試してみてください。 y
とz
はすでにブールある場合は、単純に行うことができます。
x if y == z
本について考えるの混乱を招く方法のように思われます。
ビクターの提案に基づいて補正x unless (!y^!z)
、true
でないものとして:私には明確な製剤(ルビーっぽいか、そうでない場合は)
x if (z and y) or (not z and not y)
XOR演算子を使用し、それを否定しています、false
またはnil
は^
で自分のことを行うことができます。
: Rubyは何が真理値(ゼロまたは真偽カウント以外のすなわち何でも)として動作することができますが、このコードはTrueClass、FalseClassのとNilClassで見つかった '^'オペレータの実装に依存します。 'y'がtrue、false、またはnil以外のものであれば、これは予期せず失敗します。このようにしてブーリアンを扱っていることを確認する必要があります。 –
として – Chuck
は、私はあなたが十分に良いと他の提案の選択肢よりも読みやすい思い付いたものだと思います。もっと読みやすくなるように少し修正するだけです: 'x if(z?y:!y)'。 (!Y^Z)だけビクターは、それらの読み取りのために、より明確に言ったことを置くために予防措置(Rubyがtrue'をと 'は' false'以外のものを使用することで有名です)がない限り、 'xと私はそれを書き換えるでしょう' – Behrang