使用c扩展创建的对象是否可以实例化并相互管理?

时间:2011-07-01 19:37:54

标签: c ruby ruby-c-extension

现在我有一系列使用C扩展创建的对象,所以说它们是

  • Foo
  • 酒吧
  • 巴兹。

我有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);     

或者有更清洁的方式吗?

1 个答案:

答案 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"), ...);