Ruby !!(ダブルエクスクラメーション, びっくり, exclamation)について

1pt   2018-11-09 02:22
IT技術情報局

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として判断してくれるので!!を使わなくても挙動に違いはないと思います。)

今後自分で実装する場合に、!!を使っていこうと思います。

参考

参考にさせていただきました、ありがとうございます。

Source: ruby tag

   ITアンテナトップページへ
情報処理/ITの話題が沢山。