メタプログラミングRuby読みメモ 4
5章 クラス定義
- Ruby の class キーワードはオブジェクトの動作を規定しているだけでなく、実際にコードを実行している
- クラス(やモジュール)定義の中ではクラスがカレントオブジェクトselfになる
カレントクラス
- Ruby は常にカレントオブジェクトselfを持っている
- 同様にカレントクラス(およびモジュール)も持っている
- メソッドを定義すると、それはカレントクラスのインスタンスメソッドになる
- class キーワードでクラスをオープンするとカレントクラスになる
- メソッドの中ではカレントオブジェクトのクラスがカレントクラスになる
class_eval
Module#class_eval
はそこにあるクラスのコンテキストでブロック評価する- class_eval は self とカレントクラスを変更する
- class キーワードは定数を必要とするが、class_evalはクラスを参照する変数ならなんでも使える
クラスインスタンス変数
- インスタンス変数はカレントオブジェクトselfに属しているもの
- クラス定義の中ではselfはクラス自身となる
クラス変数はクラスインスタンス変数と異なり、クラスのインスタンスやサブクラスからもアクセスできる
- main で定義したクラス変数はObjectで定義されるのでObjectを継承した他のクラスで同名のクラス変数を用いると上書きされてしまう罠があったりする
特異メソッド
- 単一のオブジェクトのみもつメソッド
- 追加しても他の同じクラスのオブジェクトに影響はない
- クラスメソッドはクラスの特異メソッド
クラスマクロ
- Ruby にはアトリビュートがないが、
Module#attr_*
を使うと読み書きのメソッドを生成できる - この attracts_accessor などのようなメソッドをクラスマクロと呼ぶ
- キーワードのように見えるがクラスメソッドである
特異クラス
- オブジェクトはクラスではないのでメソッドを持つことはできない
- オブジェクトは自身のクラスとは別に特別なクラスを持っており、特異クラスと呼ばれる
- 特異メソッドはここに存在する
- クラスメソッドはクラスの特異クラスが持つメソッドである
- 特異クラスのスーパークラスはスーパークラスの特異クラスの関係
- 特異クラスはクラスであるため特異クラスも特異クラスを持つ