時々こんなRubyコードを見かけます
def sent?
!!@sent_at
end
論理的ではないようです。ここで double を使用する必要があります!
か? 私に関する限り、それはただかもしれません
def sent?
@sent_at
end
更新:これらの違いは何ですか
def sent?
!!@sent_at
end
def sent?
@sent_at.nil?
end
def sent?
@sent_at == nil
end
時々こんなRubyコードを見かけます
def sent?
!!@sent_at
end
論理的ではないようです。ここで double を使用する必要があります!
か? 私に関する限り、それはただかもしれません
def sent?
@sent_at
end
更新:これらの違いは何ですか
def sent?
!!@sent_at
end
def sent?
@sent_at.nil?
end
def sent?
@sent_at == nil
end
私は Ruby の専門家ではありませんが、@sent_at をブール値に変換するためのものだと思います。
更新: ああ、私はあなたの更新を見ました。false
とnil
は異なることに注意してください。false.nil? == false
、一方nil.nil? == true
。ruby のみfalse
で、nil
「false」として扱われます。空の文字列でさえ、''
として評価されますtrue
( False
Python にあります)。
Double Bang
Rubyで何かをブール値に変換するために使用されます。
http://rubyquicktips.com/post/583755021/convert-anything-to-boolean
true 値を true に、falsy-value を false に強制します。Ruby では、偽値は nil と falseだけで、その他の値はすべて真値です。
!falsyExpr # given -> true
!true # and -> false
!!falsyExpr # then -> true -> false
!truthyExpr # given -> false
!false # and -> true
!!truthyExpr # then -> false -> true
このようなメソッドから返されたときに!!expr
overを使用する理由は、フォームが true または falseしか返さないためです。これにより、詳細の漏洩が回避され、偶発的な強参照が回避され、デバッグ時の混乱が軽減され、false/nil の混乱が回避されます。また、同じセマンティクスを持つ よりも短くなります。expr
!!expr
expr ? true : false
が nil に評価される場合、フォームexpr == nil
とexpr.nil?
のみが true にexpr
評価されます。falseを含むexpr
他の値に評価される場合、それらは両方とも false です。これにより、 false 値と nil値の両方で true と評価されるとは区別されます。!expr
もちろん、上記のすべては予期される動作です。Ruby のオープンな性質と演算子のオーバーロードにより、この予想される動作を変更する新しいメソッドを作成することができます (そして非常に見当違いです) (実装の最適化に関する癖がなければ)。
を使用すると、 orが返さ!!
れることが確認されます。そうです、それは理にかなっています。true
false
@sent_at = 'Foo'
!!@sent_at # => true
@sent_at = nil
!!@sent_at # => false
非ブール型をブール型 (true
またはfalse
) に変換します。
これは、明示的にキャストしようとする代わりに、これを行うためのショートカットの方法です (より多くの文字が必要になる場合があります)。!演算子は、その引数の真偽を否定します。したがって、それらのうちの2つが使用されます。
perl (または他のほとんどの言語)の二重否定 (!!) の使用も参照してください。