20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyの===演算子って何?

Last updated at Posted at 2018-10-26

概要

たのしいRubyやってて===演算子の説明が全然載ってなかったのでちょっと調べてみる。

===演算子とは

とりあえず公式のリファレンスを覗いてみる。

特殊な等号演算子。Object#===での説明:「このメソッドは case 文での比較に用いられます。 デフォルトは Object#== と同じ働きをしますが、 この挙動はサブクラスで所属性のチェックを実現するため 適宜再定義されます」。たとえば、Range#=== はother が範囲内に含まれている時に真を返します。

Rubyで使われる記号の意味(正規表現の複雑な記号は除く)

んー、なんとなくは伝わったけど…

===演算子(メソッド)は、右辺のオブジェクトobjが左辺modクラスのインスタンスであればtrue、そうでなければfalseを返します。

Rubyリファレンス

わかりやすく説明してくれているサイトを発見。

他には

左辺が単独のStringやIntegerオブジェクトの場合 ==と同じ動作

Rubyの===演算子についてまとめてみた

ふむふむ。とりあえず適当に試してみる。

とりあえず何か書く

p String === "foo"    #=> true
p Numeric === 12345   #=> true
p Symbol === :foo     #=> true

おー、なるほど。オブジェクトの属するクラスで真偽が調べられるのか。便利。
これを使えば配列やハッシュなんかを調べるときそれぞれのクラスで別の処理が簡単にかけそう…!

p 100 == 100    #=> true
p 100 === 100   #=> true

これは納得。左辺が単独のオブジェクトの場合は==演算子と動き同じをする。
これは確かに==の緩い版って言われるのもわかる。

あとは

p (1..10) == 5    #=> false
p (1..10) === 5   #=> true

p (a..z) === "z"  #=> true

おおー。これはなかなか便利そう。範囲から一致するものがあればtrueを返してくれる。
とある集合に算出した値が属してるかとか調べるのに使えそう?

case文の条件式

あとはこの===演算子はcase文の条件式に使われている。
適当に書いてみる。

array = ["hoge", 123, :foo]
array.each do |value|
  case value
    when Numeric
      puts "#{value} is a Numeric"
    when String
      puts "#{value} is a String"
    when Symbol
      puts "#{value} is a Symbol"
    else
      puts "#{value} is something"
  end
end

#=> hoge is a String  123 is a Numeric  foo is a Symbol

おおー!簡単にさっきいったような処理がかけました。これでいろんな処理が本当に楽になりそう…!

終わりに

ちょっと調べてみると=====のゆるいバージョンっていい方がよくわかった。
Ruby独特の演算子で普段Cしか触ってない自分にはとてもおもしろい演算子だなー。と思ったりした。
使えそうな機会があれば是非使ってみたい。

20
8
4

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
20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?