メタプログラミング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 などのようなメソッドをクラスマクロと呼ぶ
  • キーワードのように見えるがクラスメソッドである

特異クラス

  • オブジェクトはクラスではないのでメソッドを持つことはできない
  • オブジェクトは自身のクラスとは別に特別なクラスを持っており、特異クラスと呼ばれる
  • 特異メソッドはここに存在する
  • クラスメソッドはクラスの特異クラスが持つメソッドである
  • 特異クラスのスーパークラススーパークラスの特異クラスの関係
  • 特異クラスはクラスであるため特異クラスも特異クラスを持つ

Rubyのオブジェクトの7つのルール

  • オブジェクトは1種類しかない
    • 通常のオブジェクトかモジュール
  • モジュールは1種類しかない
    • 通常のモジュール、クラス、特異クラス
  • メソッドは1種類しかない。メソッドはモジュール(大半はクラス)が持つ
  • 全てのオブジェクトは本物のクラスを持つ
    • 通常のクラスか特異クラス
  • 全てのクラスは一つの祖先を持つ(BasicObject除く)
  • オブジェクトの特異クラスのスーパークラスはオブジェクトのクラス
  • メソッドを呼び出すときは本物のクラスを探し、そこから継承チェーンを登っていく