Ruby !!
の使い方
Rubyのコードを読むことが最近多く、結構!!
←これを見かけます。
最初わかんなくて調べたので、わかる範囲まとめます。
こんな感じで使われます。
name.rb
class Name
def initialize(first_name, last_name, middle_name=nil)
@first_name = first_name
@middle_name = middle_name
@last_name = last_name
end
def has_middle_name?
!!@middle_name # <= ここ!!
end
end
Name.new("George", "Washington").has_middle_name? #=> false
Name.new("Barack", "Obama", "Hussein").has_middle_name? #=> true
なんやそれって感じなので
!!
の挙動を確認して、!!
を使う目的を整理してみます。
挙動
!
について
- 真偽値を逆にするメソッド
-
nil
はfalse
として判断されるので、true
になる - それ以外の文字列や整数は
true
として判断されるので、false
になる
!!
の挙動
irb(main):001:0> !true
=> false # trueの逆
irb(main):002:0> !false
=> true # falseの逆
irb(main):003:0> !nil
=> true # nilは真偽値として判断するとき、falseとみなされる。そのfalseの逆
irb(main):004:0> !'hatena'
=> false # 文字列は真偽値として判断するとき、trueとみなされる。そのtrueの逆
irb(main):005:0> !!true
=> true # true → false → true
irb(main):006:0> !!false
=> false # false → true → false
irb(main):007:0> !!nil
=> false # nil(false) → true → false
irb(main):008:0> !!'hatena'
=> true # 'hatena'(true) → false → true
単純に!!
は、!
が2回繰り返されているだけのようですね
そのため、true
であれば、true
が返るというように元の真偽値が返ります。
1つずつ挙動を追えば、特に難しいことはしてないってわかりました。
じゃあ、なんでわざわざ!!
を使うのかって疑問が出てきました。
!!
を使う目的
調べて、自分が考えた!!
を使う目的です。
Ruby(他の言語でもそうである場合が多いと思いますが、、)では、基本的に?
がメソッド名の最後に来る場合、そのメソッドは真偽値(true
/false
)を返すメソッドであると普通のエンジニアは考えます。
そのため、例としてあげているhas_middle_name?
などのように!!
をつけないと、nil
を返してしまうと、
メソッド名の最後が`?`であれば、真偽値を返すメソッドである
という認識に対して、実際の挙動がずれてしまいます。
それを避けるために、そして厳格にtrue
/false
を返すために!!
を使うようです。
(もちろん、if文の条件にnil
が入ったとしても、ちゃんとfalse
として判断してくれるので!!
を使わなくても挙動に違いはないと思います。)
今後自分で実装する場合に、!!
を使っていこうと思います。
参考
参考にさせていただきました、ありがとうございます。