现在我有一系列使用C扩展创建的对象,所以说它们是
我有ruby代码,实例化其中的三个,调用它们的函数并处理结果。我们称之为:
好吧,现在经理是我的瓶颈,所以我想把它变成C扩展。但我不知道如何在Manager中实例化Foo,Bar和Baz。我是否必须使用以下代码:
VALUE module_klass = rb_const_get(rb_cObject, rb_intern("Module"));
VALUE object_klass = rb_const_get(module_klass, rb_intern("Foo"));
然后调用类似的方法:
rb_funcall(object_klass, rb_intern("new"), 0);
或者有更清洁的方式吗?
答案 0 :(得分:4)
结帐rb_class_new_instance()
。你可以这样做:
VALUE module_klass = rb_const_get(rb_cObject, rb_intern("Module"));
VALUE foo_klass = rb_const_get(module_klass, rb_intern("Foo"));
VALUE foo = rb_class_new_instance(0, NULL, foo_klass);
VALUE data = rb_funcall(foo, rb_intern("some_foo_method"), ...);