Module#===

[ Ruby ]

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

トラックバック

このエントリーのトラックバックURL:
http://www.skoji.jp/mtbin/mt-tb.cgi/960

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)