メタプログラミング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

定数が違うと便利なこと

クラス名が衝突してもモジュールで囲えば名前衝突を回避出来る