民斗です。

なんか、かなり初歩的な質問かもしれないんですが、とあるクラスの
オブジェクトを new() 以外で生成したいのです。

例えば、次のようにして、Test クラスのオブジェクトを Test.hoge() で
作れるように…。

#include <ruby.h>

VALUE cTest;

VALUE test_init(int argc, VALUE* argv, VALUE klass)
{
    VALUE obj;
    /* 何かする */
    return obj
}

void Init_test()
{
    cTest = rb_define_class("Test", cObject);
    rb_define_singleton_method(cTest, "hoge", test_init, -1);
}


…で、test_init() 中では実際に何をすればいいんでしょう?

はじめは

	obj = Data_Wrap_Struct(klass, 0, 0, 0);

としてたんですが、この obj にインスタンス変数を作成しようとすると
エラーになりました。

	class Test can not have instance variables (TypeError)

調べてみると、Test が cObject のサブクラスにも関わらず、TYPE(obj) は 
T_OBJECT ではなくて T_DATA になってしまっているためのようでした。

# でも ruby レベルでは obj.kind_of?(Object) == true で
# obj.kind_of?(Data) == false になる… (?_?)

obj_alloc() というそれっぽい関数を Data_Wrap_Object() の代わりに
使うとうまく動くようですが、obj_alloc() は README.EXT.jp に記述が
なくて、本当にこれでいいのかわかりませんでした。

あと、ruby のソースを見てみると obj_alloc() の後に obj_call_init() 
というのを呼んでたりするんですが、これも何をやっているか良くわかり
ませんでした。

--
民斗 <tommy / valley.ne.jp>