🦧

Rubyでクラスを定義するとクラス名を呼び出せる理由

2022/08/28に公開

定数の呼び出し

Hoge = 'hoge'
p Hoge #=> "hoge"

定数を定義すれば定数名で呼び出しが可能です。

クラスの呼び出し

class Foo
end

p Foo #=> Foo

定数を定義したわけでもないのに、このように呼び出せるのは不思議ですよね。

理由

Rubyではクラスを定義することで、「名前がクラス名である定数にクラスオブジェクトを代入する」という処理を行ってくれるようです。
また定数にクラスオブジェクトを代入する際、「名前のないクラスは最初に名前を求める際に代入されている定数名を検索した上で見つかった定数名をクラス名とする」という決まりがあります。

なのでクラス定義の際の挙動は分けて書くとこのような感じになります。

foo = Class.new

# 代入された定数名をクラス名とするので、この時点でクラス名がFooとなる
Foo = foo

p Foo #=> Foo

つまりクラスを呼び出した際にクラス名が返ってくる仕組みは以下となります。

  1. クラス名と同名の定数にクラスオブジェクトを代入する
  2. 無名のクラスオブジェクトは代入されている定数名をクラス名とする
  3. クラス名で呼び出すと定数を1で代入した定数を参照した上でクラス名を返す

参考

GitHubで編集を提案

Discussion