1

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

  • 酒吧
  • 巴兹。

我有 ruby​​ 代码实例化它们三个,调用它们的函数并处理结果。让我们称之为:

  • 经理

好吧,现在 Manager 是我的瓶颈,所以我想把它变成一个 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);     

还是有更清洁的方法?

4

1 回答 1

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"), ...);
于 2011-07-01T20:56:34.310 回答