🦧
Rubyでクラスを定義するとクラス名を呼び出せる理由
定数の呼び出し
Hoge = 'hoge'
p Hoge #=> "hoge"
定数を定義すれば定数名
で呼び出しが可能です。
クラスの呼び出し
class Foo
end
p Foo #=> Foo
定数を定義したわけでもないのに、このように呼び出せるのは不思議ですよね。
理由
Rubyではクラスを定義することで、「名前がクラス名である定数にクラスオブジェクトを代入する」という処理を行ってくれるようです。
また定数にクラスオブジェクトを代入する際、「名前のないクラスは最初に名前を求める際に代入されている定数名を検索した上で見つかった定数名をクラス名とする」という決まりがあります。
なのでクラス定義の際の挙動は分けて書くとこのような感じになります。
foo = Class.new
# 代入された定数名をクラス名とするので、この時点でクラス名がFooとなる
Foo = foo
p Foo #=> Foo
つまりクラスを呼び出した際にクラス名が返ってくる仕組みは以下となります。
- クラス名と同名の定数にクラスオブジェクトを代入する
- 無名のクラスオブジェクトは代入されている定数名をクラス名とする
-
クラス名
で呼び出すと定数を1で代入した定数を参照した上でクラス名を返す
Discussion