RubyリファレンスマニュアルのNet::HTTPまわりをみていたら、こんな例がありました。

response = Net::HTTP.get_response(URI.parse(uri_str))
case response
when Net::HTTPSuccess     then response
when Net::HTTPRedirection then fetch(response['location'], limit - 1)
else
response.error!
end

型チェックでcaseが使えるのか...? と不審に思い。caseの比較は===演算子だよな。

String === "foo" # ==> true
"foo" === String # ==> false
Object == "foo" # ==> true
Integer === "foo" # ==> false
Numeric === 1 # ==> true

クラスオブジェクトの===ってこういうふうに使えるようですが、どこで定義されてるんだ...?

と思ったら、Module#===が働いているようです。メカニズムまだ理解できません。

追記: あ、ClassがModuleのサブクラスだったのか! なるほど。っていうか、この疑問はそもそも恥ずかしい疑問だったんだな...。