メタプログラミングRuby 第4章 木曜日:クラス定義 その3

第4章の特異メソッドのところからです。

  • クラスメソッドは実は特異メソッドだったんだよ。な、なんだってー>ΩΩΩ とかやって欲しかった
  • attr_reader とか attr_writer のようなメソッドをクラスマクロと言うらしい
  • 「特異クラスはRuby界の UFO だ。実際に目撃することはできないが、その痕跡はあちこちに散らばってる」
    • うまいこと言うなあと思いましたが、1.9 には Object#singleton_class というメソッドがあってですね……
    • もちろん singleton_class がなくてもこのように特異クラスは目撃できます
obj = Object.new
eigen_class_of_obj = class << obj; self; end
  • 特異メソッドを保持するための場所としての特異クラス
  • コラムより、instance_eval はカレントクラスをレシーバの特異クラスに変更する。
  • 特異クラスの superclass は本来の class
  • 特異クラスの特異クラスは……は(取得しようとした瞬間に)無限に続く。これ以前、1.9 の最初の頃は特異クラスの特異クラスが Class になるようになってた時期があったと思いますが 1.8 の挙動に揃えられたんですね
  • 本書では D < C と継承関係にあるクラスで D.singleton_class.superclass は C.singleton_class になる。継承ツリーはツインタワー状態になる。

特異クラスを含んだ継承ツリーやそれを生成した時の動作は現在はすっきりわかりやすくなっているという印象です。1.9 の最初のころは若干混乱ぎみだったように思います。それでもこの部分は何度か読み返しておきたいと思います。
あと特異クラスには Object#extend でモジュールを extend する時に IClass を挿入するために作られるという側面もあります。

第4章はまだいくつかトピックがあるようなのでもう少し続きます。