newを書かずにインスタンス生成

newを書かずにインスタンス生成 - rubyco(るびこ)の日記より。id:rubycoさんはClass#inheritedにてグローバル変数を設定してからトップレベルでeval、コメントのid:sumimさんはevalの引数にトップレベルのBindingを明示的に指定している。そのほかの方法として、組み込み関数を定義するにはKernelモジュールのインスタンスメソッドとして実装してもよいみたい:

class Class
  def inherited(subclass)
    Kernel.instance_eval do
      define_method(subclass.to_s) do |*args|
	subclass.new(*args)
      end
    end
  end
end

class C1
end

class C2
  def initialize(*args)
    @args = args
  end
end

p C1()				# => #<C1:0x100f5fd0>
p C2("foo")			# => #<C2:0x100f5f40 @args=["foo"]>