Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

参考

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away