あるオブジェクトの型によって処理を場合分けしたいとき
1.rb
case "".class
when String
print "HELLO"
else
print "NOT FOUND"
end
以上のように書き実行すると、直感に反してNOT FOUND
となる。
===演算子
case文では、 ==演算子ではなく===演算子を使っている。そして
String === String #=> false
である。
ClassクラスはModuleのサブクラスである。
Module#===
は右辺が左辺modクラスのインスタンスかどうかを見ている。
String === String
について、
右辺String
はClassクラスのインスタンスなので、Stringクラスのインスタンスではない。
よってfalseが返る。
===演算子は通常、==演算子と同じ挙動をするが
-
Module#===
では、親クラスを左辺に書いてもtrueを返す。 -
Regexp#===
では/[A-Z]/ === "HELLO" #=> true
となる。
という違いが見られる(他にもある)。==で分岐するよりも柔軟に書ける。
まとめ
1.rb
を直感どおりに動かしたいならば
1.rb
case ""
when String
print "HELLO"
else
print "NOT FOUND"
end
と書くべきである。