可能性のある複製:
ルビーで!!はどういう意味ですか?
こんにちは、
Rubyが初めてで、 "!!"の意味の説明がどこにも見つかりません。
次に例を示します。
def signed_in?
!!current_user
end
これが二重否定である場合、言うべきではない:
def signed_in?
current_user
end
助けてください。
Rubyを含むほとんどのプログラミング言語では、!
は、オペランドのブール値の反対を返します。したがって、2つの感嘆符を連結すると、値がブール値に変換されます。
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と評価されます。二重否定により、戻り値はブール値になります。
!!
は、!
(ブール否定演算子)が2回書き込まれただけです。引数を否定し、否定を否定します。任意の値からブール値を取得するために使用できるため便利です。最初の!
は、引数をブール値に変換します。 true
がnil
またはfalse
の場合は_、それ以外の場合はfalse
です。 2番目は、それを再び否定するので、引数のブール値、false
をnil
またはfalse
、true
を取得します。
Rubyでは、if
ステートメントで任意の値を使用できます。たとえば、現在のユーザーがnil
でない場合、if current_user
が実行されます。明示的なテスト(少なくとも6文字以上のif !current_user.nil?
など)を入力する手間を省くことができるので素晴らしいですが、メソッドがブール値を返すことを暗示しているときにオブジェクトを返すと混乱する場合があります。名前が?
で終わる場合は、真の値または偽の値を返す必要があります。つまり、true
またはfalse
に評価されるものを返します。ただし、signed_in?
たとえば、signed_in?
を使用するコードが機能しない理由をデバッグしようとしている場合、ユーザーオブジェクトがtrue
またはfalse
。その状況では、return
の前に!!
を追加すると便利です。これは、真偽値または偽の値がtrue
またはfalse
。