小林です。

[ruby-list:19870] Re: initialization & superの自己レス
と疑問点です。ruby-listよりこちらかなと思い、引っ越し
ました。ちょっと、分かりずらいとは思いますが、よろし
くお願い致します。

> class A < SDBM
>   def A.new(*args)
>     super.instance_eval {initialize(*args); self}
>   end
> end
>
> を加えてみてください。この例では SDBM::new と A#initialize に同じ
> 引数が渡ります。
>
[説明]
上記のなかださんからのレスは以下のコードを実行したとき
結果が
    B s=c:\tmp\t
    A s=c:\tmp\t
にならないことへの回答です。

require 'sdbm'
class A < SDBM
 def initialize(s)
  print "A s=",s,"\n"
  super(s)
 end
end

class B<A
 def initialize(s)
  print "B s=",s,"\n"
  super(s)
 end
end
a = B::new("c:\\tmp\\t")

で、
> # ただ、sdbmはOK、だけど私のBigFloatではうまくいかない!
>
でした。調べた結果、原因が以下のようであることがわかりました。
static VALUE BigFloat_new(VALUE self,VALUE nFig,VALUE iniValue)
{
...
return Data_Wrap_Struct(CLASS_OF(self) ,0,BigFloat_delete,pv);
}
とやるとだめで、
 return Data_Wrap_Struct(self ,0,BigFloat_delete,pv);
だとOKです。
だめな例は、md5init.c、OKなのはsdbmのinit.cを例に作成しました。
共に配布ライブラリです。どちらが正しいのでしょうか?

小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
Home Page: http://www.tinyforest.gr.jp