概要
たのしいRubyやってて===
演算子の説明が全然載ってなかったのでちょっと調べてみる。
===
演算子とは
とりあえず公式のリファレンスを覗いてみる。
特殊な等号演算子。Object#===での説明:「このメソッドは case 文での比較に用いられます。 デフォルトは Object#== と同じ働きをしますが、 この挙動はサブクラスで所属性のチェックを実現するため 適宜再定義されます」。たとえば、Range#=== はother が範囲内に含まれている時に真を返します。
んー、なんとなくは伝わったけど…
===演算子(メソッド)は、右辺のオブジェクトobjが左辺modクラスのインスタンスであればtrue、そうでなければfalseを返します。
わかりやすく説明してくれているサイトを発見。
他には
左辺が単独のStringやIntegerオブジェクトの場合
==
と同じ動作
ふむふむ。とりあえず適当に試してみる。
とりあえず何か書く
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しか触ってない自分にはとてもおもしろい演算子だなー。と思ったりした。
使えそうな機会があれば是非使ってみたい。