From: gotoken@... (GOTO Kentaro) Date: 1999-11-24T01:49:01+09:00 Subject: [ruby-list:18867] Re: initializer polymorphism? ごとけんです In message "[ruby-list:18860] Re: initializer polymorphism?" on 99/11/23, "Shigeo Kobayashi" writes: >私にはrubyの奥義を垣間見たような気がします。 そんなことないって ^^;; >> class A >> class << self >> alias __new__ new >> end >> >> def A.new(*arg) >> __new__(*arg).instance_eval{init1(*arg); self} >> end >> >> def A.new2(*arg) >> __new__(*arg).instance_eval{init2(*arg); self} >> end >> >ちょっと、質問させてください. >"class << self" はなぜ必要なのでしょうか? >class とend をコメントにすると「undefined method `new' >for class `A'」となるので必要であることはわかるのです >が... class A のクラスメソッドである new を保存するために alias を 使いたいからです。alias はクラス定義の文脈かトップレベルでし か使えないので、 alias A.__new__ A.new とは出来ません。この方法がよく使われる方法かどうかは知りませ んが、僕はしばしばこうしてます。 >条件分岐がいやなら > >class Test > def initialize(*arg) > yield arg > end >end > >obj=Test.new(1,2) { |a| print "number of args=",a.size,"\n"} # number of >args=2 >obj=Test.new(1,2,3) { |a| print "number of args=",a.size,"\n"} # number of >args=3 > >とやってみたら、OKでした。 それだと、実装を外に任せることになるのでカプセル化と言う観点 ではあんまり良くない気もします。また、本来やるべきインスタン ス変数の初期化が面倒でもあるでしょう。場合によっては有効とは 思いますが。 -- gotoken