回答:
そうではありません。値をブール値に変換するために使用されます:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
ただし、Rubyへの唯一の偽の値はnil
and false
であるため、通常は使用する必要はありません。そのため、通常はこの規則を守ることが最善です。
それを次のように考える
!(!some_val)
正当に使用されていることの1つは、大量のデータが返されるのを防ぐことです。たとえば、has_image?
メソッドで3MBの画像データを返したくない場合や、メソッドでユーザーオブジェクト全体を返したくない場合がありますlogged_in?
。を使用!!
すると、これらのオブジェクトが単純なtrue
/に変換されますfalse
。
.nil?
使用するのではなく、単に戻るのはなぜ!!
ですか?違いはありますか?
!!true #=> true
およびtrue.nil? #=> false
!
ブール状態を否定することを意味します。2つ!
のsは、二重否定以外に特別なものではありません。
!true == false
# => true
通常、メソッドにブール値を返すように強制するために使用されます。文字列、整数など、あらゆる種類の真実性を検出し、ブール値に変換します。
!"wtf"
# => false
!!"wtf"
# => true
より実際的な使用例:
def title
"I return a string."
end
def title_exists?
!!title
end
これは、ブール値が確実に返されるようにする場合に役立ちます。私見それは一種の無意味ですが、両方if 'some string'
とif true
まったく同じフローであることがわかりますが、一部の人々は明示的にブール値を返すことが有用であると感じています。
title
、それに最も近いことをするのも良いかもしれません...おそらく
このイディオムは他のプログラミング言語にも存在することに注意してください。Cには組み込みbool
型がなかったため、すべてのブール値はint
代わりに0
またはの正規値で型付けされました1
。この例を取り上げます(わかりやすくするために括弧を追加しています)。
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
「not-not」構文は1
、ゼロ以外の整数を正規のブール値trueに変換します。
ただし、一般的には、この一般的ではないイディオムを使用するよりも、妥当な比較を行う方がはるかに優れています。
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
これは「ダブルネガティブ」ですが、この習慣は推奨されていません。rubocopを使用している場合は、Style/DoubleNegation
違反のあるコードに対して文句が表示されます。
根拠の状態:
これは不可解な、通常は冗長でもあるとして、それは避けるべきである[その後、言い換え:]を変更
!!something
します!something.nil?
!!false # => false
しばらく!false.nil? # => true
!(foo.nil? || foo == false)
—より冗長ですが、不可解ではありません。
たとえば、列挙型をブール値に変換する必要がある場合は、それがどのように機能するかを理解することが役立ちます。私はclassy_enum
gem を使用してそれを正確に行うコードを持っています:
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
それから私が持っているサービスコードでは、例えば:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
事実上、bangbangオペレーターは、to_boolと呼ばれるメソッドとして筆者が作成したものになった。