メタプログラミングRuby読書会 第2回

3月5日にメタプログラミングRuby読書会を実施しました。

メタプログラミングRuby の中で、カレントクラスという用語が説明されていましたが、
説明が分かりにくいように感じたので新たに整理していこうと思います。

カレントクラスとは、def method_name args ... end のような書き方で、メソッドが定義される場所のことです。

カレントクラスは次のように考えることができます。
- クラスのコンテキストであれば、現在のクラス
- オブジェクトのコンテキストであれば、self のオブジェクトの特異クラス

クラスのコンテキストに遷移する方法は次の2通りあり、その場合はそのクラスがカレントクラスになります。
- class または module キーワードでクラス(モジュール)をオープンする
- class_eval でレシーバのクラスをオープンする

逆にオブジェクトのコンテキストに遷移するには、instance_eval を使うことになります。この場合はそのオブジェクトの特異クラスがカレントクラスになります
つまり、 instance_eval の中の def はそのオブジェクトの特異メソッド定義になります

クラスのコンテキストへの遷移の中で特に、class <

# (1) トップレベルのメソッド定義( Object に定義される)
def toplevel_method
end

# (2) クラスのコンテキストでのメソッド定義
#     クラスA のインスタンスメソッドとして定義される
class A 
  def instance_method1
  end
end

# (3) class_eval を利用してクラスのコンテキストでメソッド定義
#     クラスA のインスタンスメソッドとして定義される
A.class_eval do
  def instance_method2
  end
end

# (4) 特異クラスのコンテキストで実行するための記法 <