豊福です。

前田さん
>>>   組み込みだと NEWOBJ() とか OBJSETUP() のとこから違うのでちょっと特殊で
>>> す。
>>
>>   んーと、よくわかりません。C で実装したクラスはすべて
>> 「組み込み」だと思っていたのですが、Ruby/Jed の Buffer
>> クラスと Ruby の基本の Arrayクラスで扱いが違ってくるのは
>> なぜでしょうか。Bufferクラスを Arrayクラスのように実装
>> しない(できない?)理由は。
> 
> 通常のオブジェクトはT_OBJECTというデータタイプなのですが、Arrayな
> どはそれとは別のデータタイプになっていて扱いがちょっと違います。

  そもそも「Arrayクラスは NEWOBJ() を使っているのになぜ
Bufferクラス(T_OBJECT)は rb_obj_alloc() を使うのか」という
疑問だったのですがソースみたら
    VALUE rb_obj_alloc(klass)
        VALUE klass;
    {
        NEWOBJ(obj, struct RObject);
        OBJSETUP(obj, klass, T_OBJECT);
        return (VALUE)obj;
    }
でしたので間の抜けた疑問でした。
  egrep -n 'NEWOBJ|OBJSETUP|CLONESETUP' *.c して確認しましたが
NEWOBJ() と *SETUP() はほとんどペアで使うのですね。あからさま
にはペアでないところは10箇所だけでした。(うち、rb_ary_s_new()
と rb_str_s_new() の中の OBJSETUP() は必要ないような気もしますが)

  あらためて私の理解は
「(T_OBJECTタイプで実装されている) Bufferクラスは Array
クラスと同様の「組み込み」クラスである」です。

> T_OBJECTでない(たとえばT_DATAの)クラスを定義する時は、
> newを再定義する必要があります。
> # initializeがよばれる時にはすでにT_OBJECTなオブジェクトを生成し
> # てしまった後だから。

  ここよくわかりません。(ソース追わないと腑に落ちないかも)

> 普通構造体をラップする場合はT_DATAを使うのですが、昔はT_DATAで表
> 現されるオブジェクトはインスタンス変数を持つことができなかったの
> で、BufferクラスはT_OBJECTで実装しました。
> # Bufferオブジェクトにインスタンス変数を持たせたかったので。
> 今はT_DATAで表現されるオブジェクトもインスタンス変数を持つことが
> できるので、T_DATAで実装した方がよいかもしれません。

> Bufferクラスでnewを再定義してるのは、たぶん最初はT_DATAで実装した
> からだと思います。

  Bufferクラスの事情はだんだん理解できてきました。


まつもとさん
>|・rb_obj_alloc(), Data_Wrap_Struct(), NEWOBJ() の使い分け。
> 
>   rb_obj_alloc()
>     T_OBJECTなタイプのオブジェクトの生成
> 
>   Data_Wrap_Struct()
>     T_DATAなタイプのオブジェクトの生成
> 
>   NEWOBJ()
>     任意のタイプのオブジェクトの生成。
>     拡張ライブラリでは使わないんじゃないかなあ。

  Data_Wrap_Struct() もソース見たら
    VALUE rb_data_object_alloc(...)
        ...
    {
        NEWOBJ(data, struct RData);
        OBJSETUP(data, klass, T_DATA);
        data->data = datap;
        data->dfree = dfree;
        data->dmark = dmark;
        return (VALUE)data;
    }
でしたので、これも NEWOBJ() と比較しても意味なかったですね。

ということで質問の変更。
・T_OBJECT と T_DATA の使い分けと、それぞれでの new と
  initialize の流れ。

> |・上記の話も含めた、組み込みの仕方を一から説明したドキュ
> |  メントがあると嬉しい。
> 
> 誰か書いて ^^;;;

  まだまだしつこく質問していきますのでこのスレッドが(誰かが)
ドキュメントを書くときの一助になると嬉しゅうございます。

> |・クラス、インスタンスを作るサンプルプログラム(それだけ
> |  で完結して実行できる数十行程度の)があると嬉しい。
> 
> ext/dbm.cとかじゃダメ?
 
  組み込みとしてのサンプルの方がよいので main があって
そこからクラス定義してインスタンス作ってメソッド呼ぶと
なんか出力されてというのがいいです。それとdbm という素材
は私には身近にかんじられないのでなにか別の身近なものが
よいです。
---
                                豊福
                                toyofuku / juice.or.jp