ある変数の型をチェックして、そのクラスによって処理を変えて、他のところに渡すような処理を考えていました。その処理自体は一行程度で済むので、どうせならcaseで書き換えてもいいだろうと思って、書き換えてみたところ、上手く動いてくれません。

具体的には、以下のようなコードです:

 def type_check_with_if n
   if n.class == String
     "文字列だ!"
   elsif n.class == Hash
     "ハッシュだ!"
   end
 end

 def type_check_with_case n
   case n.class
   when String  then "文字列だ!"
   when Hash    then "ハッシュだ!"
   end
 end

 test_seed = ["foobar", {:foo => :bar}]
 p test_seed.map {|n| type_check_with_if n }
 # => ["文字列だ!", "ハッシュだ!"]
 p test_seed.map {|n| type_check_with_case n}
 # => [nil, nil]

本当なら、type_check_with_caseでも["文字列だ!", "ハッシュだ!"]という出力を期待しているのですが、結果は上記の通り、nilの配列です。

もしかして、自分はcaseの仕様を何か勘違いしているのでしょうか? もし、勘違いしていたとするならば、参考情報を含めて教えて頂ければ嬉しいです。