ごとけんです
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