クラスはオブジェクトであり、クラス名は定数である
ウサギ本を読んでいたところ、先の 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>
おお。