From: nobu.nakada@... Date: 2003-07-29T20:53:16+09:00 Subject: [ruby-dev:21005] constructor methods (was Re: Re: Rational 始めました。) なかだです。 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はできる。 中田 伸悦