メタプログラミングRuby第二章(2.2~)
クラスの真相
Classクラスのインスタンスはクラス!
クラスのメソッドはClassクラスのインスタンスメソッド
Classクラスとは?
クラス(ここでいうクラス名は大文字) はClassクラスのインスタンスである。
Stringクラスを例にとると String.class #Class ←Classクラス
moduleとは?
全てのクラスはモジュールである。 Classはインスタンスメソッド(new、allocate、superclass)を追加したモジュールである。 モジュールの使い分けとしては共通的なものはまとめてることが多い。 そしてクラスからmix-inして使えば良い。
定数とは?
定数とは大文字で始まるもの クラス名は定数
定数と変数の違いはスコープ範囲が違う
定数はディレクトリが違えば、一緒ではない、 定数の参照はclass外(含Module)では コロン2つをつけて指定する。 クラス外で定数を定義した場合、暗黙的に Objectクラス の定数になる
module M class C A = "クラス内" p A end A = "モジュール内" p C::A #定数 p A #AA end B = "モジュール外" p M::C::A #クラス内 p M::A #モジュール内 p Object::B #モジュール外 p B #モジュール外 p B.class #String p B.class.superclass #Object
定数が違うと便利なこと
クラス名が衝突してもモジュールで囲えば名前衝突を回避出来る