我目前正在尝试获取类的所有实例,并且我想使用ObjectSpace.each_object来实现。

这是我在C中的实际代码:

ruby_init();
int ruby_state = 0;
rb_string_eval_protect("def my_func ; ObjectSpace.each_object(Klass) { |x| x.do_something } ; end", &ruby_state);
ruby_cleanup(ruby_state);


但是,我不知道这是否真的是一件好事。我想改用rb_funcall,这也许是一种更清洁的方法。

我的问题是:


使用rb_funcallstring_eval更好吗? (我认为是因为解析器)
由于ObjectSpace似乎不存在,如何在C API中检索rb_mObjectSpace模块?

最佳答案

我发现了该怎么做。它正在使用rb_const_get

现在是下面的代码:

VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));


该模块已在gc.c中定义,但未公开。访问该模块的唯一方法似乎是通过rb_const_get(或修改gc.c并构建ruby,但没人愿意这样做)。

关于c - 如何在不使用rb_string_eval的情况下使用C API调用ObjectSpace.each_object?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43705163/

10-12 02:13