web-dev-qa-db-ja.com

ルビー、!!演算子(a / k / aダブルバング)

可能性のある複製:
ルビーで!!はどういう意味ですか?

こんにちは、

Rubyが初めてで、 "!!"の意味の説明がどこにも見つかりません。

次に例を示します。

def signed_in?
  !!current_user
end

これが二重否定である場合、言うべきではない:

def signed_in?
  current_user
end

助けてください。

92
Vitaly

Rubyを含むほとんどのプログラミング言語では、!は、オペランドのブール値の反対を返します。したがって、2つの感嘆符を連結すると、値がブール値に変換されます。

113
icktoofay

Ruby(および他の多くの言語))には、ブールコンテキストでtrueに評価される多くの値があり、falseに評価される少数の値があります。Rubyでは falseと評価されるのは、false(それ自体)とnil のみです。

何かを否定すると、ブールコンテキストが強制されます。もちろん、それも否定します。ダブルネゲートすると、ブールコンテキストが強制されますが、適切なブール値が返されます。

例えば:

"hello"   #-> this is a string; it is not in a boolean context
!"hello"  #-> this is a string that is forced into a boolean 
          #   context (true), and then negated (false)
!!"hello" #-> this is a string that is forced into a boolean 
          #   context (true), and then negated (false), and then 
          #   negated again (true)
!!nil     #-> this is a false-y value that is forced into a boolean 
          #   context (false), and then negated (true), and then 
          #   negated again (false)

あなたの例では、signed_in?メソッドは、ブール値を返す必要があります(? キャラクター)。この値を決定するために使用する内部ロジックは、current_user変数が設定されています。設定されている場合、ブールコンテキストでtrueに評価されます。そうでない場合は、falseと評価されます。二重否定により、戻り値はブール値になります。

136
pkaeding

!!は、!(ブール否定演算子)が2回書き込まれただけです。引数を否定し、否定を否定します。任意の値からブール値を取得するために使用できるため便利です。最初の!は、引数をブール値に変換します。 truenilまたはfalseの場合は_、それ以外の場合はfalseです。 2番目は、それを再び否定するので、引数のブール値、falsenilまたはfalsetrueを取得します。

Rubyでは、ifステートメントで任意の値を使用できます。たとえば、現在のユーザーがnilでない場合、if current_userが実行されます。明示的なテスト(少なくとも6文字以上のif !current_user.nil?など)を入力する手間を省くことができるので素晴らしいですが、メソッドがブール値を返すことを暗示しているときにオブジェクトを返すと混乱する場合があります。名前が?で終わる場合は、真の値または偽の値を返す必要があります。つまり、trueまたはfalseに評価されるものを返します。ただし、signed_in?たとえば、signed_in?を使用するコードが機能しない理由をデバッグしようとしている場合、ユーザーオブジェクトがtrueまたはfalse。その状況では、returnの前に!!を追加すると便利です。これは、真偽値または偽の値がtrueまたはfalse

30
Theo

当然のことながら、これは!演算子の二重否定の使用です。とはいえ、変数がnilであるかどうかを確認する簡単な方法ですが、IMOはtoo conciseです。 this および this postをご覧ください。 Rubyでは、nilに対して何かをテストするとfalseと評価されることに注意してください。

4
Zabba