あおきです。

  In mail "[ruby-dev:8719] Re: initialization & super"
    "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> 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 です。
-------------------------------------------------------------------
あおきみねろう