如何在没有 rb_string_eval 的情况下用 C API 调用 ObjectSpace.each_object?
How to call ObjectSpace.each_object with C API without rb_string_eval?
我目前正在尝试获取 class 的所有实例,我想使用 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
更好吗? (我认为是因为解析器)
- 由于
rb_mObjectSpace
似乎不存在,我如何在 C API 中检索 ObjectSpace
模块?
我找到了如何做到这一点。它正在使用 rb_const_get
.
现在是代码:
VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
该模块已在 gc.c
中定义,但未在 public 中定义。访问该模块的唯一方法似乎是 via rb_const_get
(或修改 gc.c 并构建 ruby,但没有人愿意这样做那个)。
我目前正在尝试获取 class 的所有实例,我想使用 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
更好吗? (我认为是因为解析器) - 由于
rb_mObjectSpace
似乎不存在,我如何在 C API 中检索ObjectSpace
模块?
我找到了如何做到这一点。它正在使用 rb_const_get
.
现在是代码:
VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
该模块已在 gc.c
中定义,但未在 public 中定义。访问该模块的唯一方法似乎是 via rb_const_get
(或修改 gc.c 并构建 ruby,但没有人愿意这样做那个)。