我目前正在尝试获取类的所有实例,并且我想使用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_funcall
比string_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/