0

重複の可能性:
What does !! ルビーで意味?
ルビー、!! 演算子 (a/k/a ダブルバン)

時々こんな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
4

5 に答える 5

4

私は Ruby の専門家ではありませんが、@sent_at をブール値に変換するためのものだと思います。

更新: ああ、私はあなたの更新を見ました。falsenilは異なることに注意してください。false.nil? == false、一方nil.nil? == true。ruby のみfalseで、nil「false」として扱われます。空の文字列でさえ、''として評価されますtrue( FalsePython にあります)。

于 2012-09-08T06:20:52.687 に答える
2

Double BangRubyで何かをブール値に変換するために使用されます。

http://rubyquicktips.com/post/583755021/convert-anything-to-boolean

于 2012-09-08T06:22:27.320 に答える
1

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

このようなメソッドから返されたときに!!exproverを使用する理由は、フォームが true または falseしか返さないためです。これにより、詳細の漏洩が回避され、偶発的な強参照が回避され、デバッグ時の混乱が軽減され、false/nil の混乱が回避されます。また、同じセマンティクスを持つ よりも短くなります。expr!!exprexpr ? true : false

が nil に評価される場合、フォームexpr == nilexpr.nil? のみが true にexpr評価されます。falseを含むexpr他の値に評価される場合、それらは両方とも false です。これにより、 false 値と nil値の両方で true と評価されるとは区別されます。!expr

もちろん、上記のすべては予期される動作です。Ruby のオープンな性質と演算子のオーバーロードにより、この予想される動作を変更する新しいメソッドを作成することができます (そして非常に見当違いです) (実装の最適化に関する癖がなければ)。

于 2012-09-08T06:22:19.187 に答える
1

を使用すると、 orが返さ!!れることが確認されます。そうです、それは理にかなっています。truefalse

@sent_at = 'Foo'
!!@sent_at # => true

@sent_at = nil
!!@sent_at # => false
于 2012-09-08T06:22:27.933 に答える
1

非ブール型をブール型 (trueまたはfalse) に変換します。

これは、明示的にキャストしようとする代わりに、これを行うためのショートカットの方法です (より多くの文字が必要になる場合があります)。!演算子は、その引数の真偽を否定します。したがって、それらのうちの2つが使用されます。

perl (または他のほとんどの言語)の二重否定 (!!) の使用も参照してください。

于 2012-09-08T06:23:00.030 に答える