LoginSignup
11
11

More than 5 years have passed since last update.

case文の不思議な挙動

Last updated at Posted at 2014-12-13

あるオブジェクトの型によって処理を場合分けしたいとき

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

と書くべきである。

参考

11
11
0

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
11
11