【问题标题】:How to call ObjectSpace.each_object with C API without rb_string_eval?如何在没有 rb_string_eval 的情况下使用 C API 调用 ObjectSpace.each_object?
【发布时间】:2017-04-30 09:58:20
【问题描述】:

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

【问题讨论】:

    标签: c ruby api objectspace funcall


    【解决方案1】:

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

    现在是代码:

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多