ごとけんです

In message "[ruby-list:18860] Re: initializer polymorphism?"
    on 99/11/23, "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> 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