メタプログラミングRuby読書会 第2回
メタプログラミング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) 特異クラスのコンテキストで実行するための記法 <