0

我目前正在尝试获取一个类的所有实例,我想用它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
4

1 回答 1

0

我找到了如何做到这一点。它正在使用rb_const_get.

这是现在的代码:

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

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

于 2017-04-30T10:57:55.853 回答