まつもと ゆきひろです

In message "[ruby-ext:00067] Re: Object の生成"
    on 99/01/14, Yukihiro Matsumoto <matz / netlab.co.jp> writes:

|> そのクラスの「タイプ」はT_OBJECTを望んでいるんですね.その場
|> 合にはご推察の通り,obj_alloc(1.3ではrb_obj_alloc)で正解です.
|
|T_OBJECT というより、インスタンス変数が使えるのが望みなんです。
|結果的に選択肢は T_OBJECT しかないようですが。


そうですね.1.2ではインスタンス変数はT_OBJECT, T_CLASS,
T_MODULEしか持てません.

|Data_Wrap_Object() では、そのオブジェクトに第四引数でデータを保持
|できるようですが、同じことが obj_alloc() でも可能でしょうか?
|
|# "obj = obj_alloc(cTest); DATA_PTR(obj) = fuga;" でいいのかな…?

あ〜,T_OBJECTはインスタンス変数を保持する機能はあるのですが,
今度はCのポインタを保持する機能はないのですよ.

これに対応するには

  * Cのポインタを保持する内部オブジェクト(T_DATA)を別に用意
    し,外側のオブジェクトはインスタンス変数を持てる通常のオ
    ブジェクトにする.内部オブジェクトは外側のオブジェクトの
    インスタンス変数で保持する.

  * ruby 1.3で実装する.1.3ではすべてのオブジェクトが(効率の
    問題はあっても)インスタンス変数が持てる.

のいずれかが良いでしょうね.

|さらにお聞きしたいんですが、T_DATA と T_OBJECT の違いというのは
|インスタンス変数を持てるかどうか以外にも何かあるんでしょうか?

全然違います.T_DATAはCのポインタ保持専用,T_OBJECTは「普通
の」オブジェクトの実装専用です.

                                まつもと ゆきひろ /:|)