Rubyのコンストラクタについて

コンストラクタ - RubyBeginner (ルビギナー)の世にも奇妙な開発

initializeはRubyの仕組みでNewというエイリアスコールができるようになっているようです。

エイリアスではない。Class#newがそう定義しているだけ。

Rubyはクラスそのものがオブジェクト…つまりClassクラスのインスタンスになっている。

class Hoge
end

Hoge.class                      # => Class
Object.class                    # => Class

で、Classのインスタンスメソッドnew(Class#new)は「オブジェクトの領域確保をし、そのオブジェクトのinitializeメソッドを呼び、そのオブジェクトを返す」メソッドとして定義されている。あえてRubyで書くとこんなの。

class Class
  def new(*args, &block)
    o = allocate
    o.__send__(:initialize, *args, &block)
    o
  end
end

で、Hoge.newが呼び出されたときどうなるかというと、

  • 特異メソッドHoge.newは定義されていない。
  • HogeクラスオブジェクトはClassのインスタンスだから、Class#newが呼び出される。

だから、Hogeオブジェクトの領域確保がされて、Hoge#initializeが呼ばれて、作成したHogeオブジェクトが返される。