From: Minero Aoki Date: 1999-12-24T23:23:14+09:00 Subject: [ruby-dev:8720] Re: initialization & super あおきです。 In mail "[ruby-dev:8719] Re: initialization & super" "Shigeo Kobayashi" wrote: > 小林です。 > でした。調べた結果、原因が以下のようであることがわかりました。 > 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を例に作成しました。 > 共に配布ライブラリです。どちらが正しいのでしょうか? どちらも正しいです。 (以下、次のような記法を使います。 クラス x のクラスメソッド(特異メソッド) m => x.m クラス x のインスタンスのメソッド m => x#m ) md5init.c の例というのは md5_clone() のことだと思いますが、 これは MD5#clone の定義ですから、 引数の self は MD5 クラスのインスタンスです。 Data_Wrap... で欲しいのはクラスオブジェクト MD5 ですから、 必要なのは CLASS_OF(self) です。 一方、sdbm の例というのは fsdbm_s_open のことだと思いますが、 これは SDBM.open の定義ですから、 引数の klass(=self) はクラスオブジェクト SDBM です。 このとき欲しいのはクラスオブジェクト SDBM ですから、必要なのは klass そのままです。( CLASS_OF(klass)はオブジェクト Class ) 小林さんの BigFloat の場合だと、定義しているのは BigFloat.new ですから、self はクラスオブジェクト BigFloat です。 つまり、self そのままが正解です。 ちなみにこのときの CLASS_OF(self) はオブジェクト Class です。 ------------------------------------------------------------------- あおきみねろう