Module#===
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のサブクラスだったのか! なるほど。っていうか、この疑問はそもそも恥ずかしい疑問だったんだな...。