メタプログラミングRubyを読んでいます。完全自分用のメモ記事です。
第5章の「クラス定義」で特に参考になった部分を中心に書いています。
😀 5章クラス定義
カレントクラスとは?
- プログラムのトップレベルでは「カレントクラス」はmainクラスのObjectになる - classキーワードでクラスをオープンするとそのクラスが「カレントクラス」となる - メソッドの中では、カレントオブジェクトのクラスがカレントクラスとなる
class_evalを使ったメソッドの定義
def add_method_to(a_class) |
カレントクラスのまとめ
- Rubyのインタプリタはカレントクラスの参照を追跡する。defで定義されたメソッドはカレントクラスのインスタンスメソッドとなる - クラス定義内では、カレントオブジェクト self と カレントクラスは同義である - クラスへの参照を持っていれば、クラスはclass_eval(module_eval)でオープンできる
クラスインスタンス変数
class MyClass |
クラス変数の癖
@@v = 1 |
実行結果はこちら。
ruby xxx.rb |
警告は出ているが、@@v
の内容が書き換えられていることが分かる。
クラスメソッド
クラス・メソッドは『クラスの特異メソッド』。
class MyClass |
確かにいわれてみれば、特異メソッドといえるかも。
🎳 クラス拡張
次の実装をクラス拡張という。
module MyModule |
このクラス拡張のためのメソッドが、extend
。(extend
がなくても自分で実装できる)
module MyModule |
🍮 サンプルソース
何かの役に立つこともあるかもですので、リポジトリも公開しておきます。
morizyun/meta_programming_ruby2 - GitHub