クラスはオブジェクトであり、クラス名は定数である

ウサギ本を読んでいたところ、先の Object#const_get の理解を助けてくれる解説を見つけました。P.292 の "クラス名は定数である" の箇所です。

また、Ruby のクラスは Class オブジェクトというオブジェクトでした。したがって、クラスメソッドを呼び出すのは Class オブジェクトにメッセージを送信しているということになります。Ruby の特徴である「すべてがオブジェクト」と聞いてすぐ想像するのは Java のプリミティブ型もオブジェクトであるというあたりですが、クラスもオブジェクトであるというのは面白いです。

$ irb
irb(main):001:0> Object.const_get(:String).class
=> Class

たしかに、クラスを取得してそのクラスを調べると Class クラスです。

クラスがオブジェクトであるということは、クラスも他のオブジェクトと同じように扱うことができ、

  • クラスをコピーしたり
  • クラスにメソッドを渡したり
  • クラスを敷きとして使用したり

といったことができるとウサギ本に書いています。

irb#1(main):001:0> def factory(klass, *args)
irb#1(main):002:1> klass.new(*args)
irb#1(main):003:1> end
=> nil
irb#1(main):004:0> factory(String, "Hello")
=> "Hello"
irb#1(main):005:0> factory(Dir, ".")
=> #<Dir:0x31e3c0>

おお。