LoginSignup
4
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-08

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

なんやそれって感じなので
!!の挙動を確認して、!!を使う目的を整理してみます。

挙動

!について

  • 真偽値を逆にするメソッド
  • nilfalseとして判断されるので、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として判断してくれるので!!を使わなくても挙動に違いはないと思います。)

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

参考

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

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0