なかだです。

At Tue, 29 Jul 2003 18:45:47 +0900,
Tanaka Akira wrote:
> これを解決するには、
> 
> * なにか別の言語機構を考えてそういう状況を簡単に回避できるようにする、
> 
> * alias とかの方法を idiom として広めて簡単に思いつくようにする、
> 
> といったことが考えられて、この記事はなんとなく後者っぽいことをやってい
> たりするわけですが、前者の方向でなんかうまいのってないですかねぇ?
> 
> たとえば、単なる思いつきですが、Rational の方法を一般化して Class#new!
> を initialize! を呼び出すように定義しておく、とか。

クラスメソッドとインスタンスメソッドのペアが、newとinitialize以
外にもあったほうがいい、ということでしょうか。

それが楽にできれば構文でなくてもいいというのであれば、こんなの
を思い付きましたが。

class Class
  def constructor(c, &b)
    mod = Module.new(&b)
    meth = mod.instance_methods(false)
    unless meth.size == 1
      raise TypeError, "must be single method"
    end
    meth = meth[0].intern
    include(mod)
    define_method(meth, mod.instance_method(meth))
    private(meth)
    (/(.*):(\d+)\z/ =~ caller(1)[0])
    class_eval("def self.#{c}(*a, &b) (o = allocate).send :#{meth}, *a, &b; o end",
               $1, $2.to_i)
  end
end

class Test
  constructor(:new3) do
    def initialize3(a, b, c)
      @a, @b, @c = a, b, c
      yield self
    end
  end
end

a = Test.new3(1,2,3) {|x| p x}

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦