From: Bryan Richardson Date: 2008-05-06T21:49:51+09:00 Subject: Yet another question about extending ruby with C Hello all, I'm still working on figuring how how to extend ruby with C libraries. Hope someone can help me with this one! Say I have the following: typedef struct { char* name; } Foo; static VALUE rb_cBar; static VALUE rb_cTest; static VALUE foo_new(VALUE self) { Foo* f; VALUE info; info = Data_Make_Struct(rb_cTest, Foo, 0, free, f); rb_obj_call_init(info, 0, 0); return info; } static VALUE foo_init(VALUE self) { VALUE str; char* name = "Bryan"; str = rb_str_new2(name); rb_iv_set(self, "@name", str); return self; } static VALUE test(VALUE self, VALUE arg) { Foo* f; Data_Get_Struct(arg, Foo, f); printf("Name: %s\n", f->name); return Qnil; } void Init_power_flow() { rb_cBar = rb_define_class("Bar", rb_cObject); rb_cTest = rb_define_class("Test", rb_cObject); rb_define_method(rb_cBar, "test", test, 1); rb_define_method(rb_cBar, "new_foo", foo_new, 0); rb_defien_method(rb_cTest, "initialize", foo_init, 0); } If I do the following, everything works perfectly and I see my name printed on the screen: b = Bar.new f = b.new_foo b.test(f) // prints "Bryan" However, say I change the foo_new method to be the following: static VALUE foo_new(VALUE self) { Foo* f; VALUE info; f = ALLOC(Foo); f->name = "Bryan"; info = Data_Wrap_Struct(self, 0, free, f); return info; } and I change the method declaration in Init to be the following: rb_define_method(rb_cTest, "initialize", foo_new, 0); Now, when I do what I did before, I get an error: b = Bar.new f = Test.new b.test(f) // TypeError: wrong argument type Test (expected Data) Any idea why trying to define a constructor rather than a 'factory' method is causing me issues? -- Thanks in advance! Bryan -- Posted via http://www.ruby-forum.com/.