如何在没有 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_const_get.

现在是代码:

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

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