gpt4 book ai didi

c - 如何在没有 rb_string_eval 的情况下使用 C API 调用 ObjectSpace.each_object?

转载 作者:行者123 更新时间:2023-11-30 16:46:31 25 4
gpt4 key购买 nike

我目前正在尝试获取类的所有实例,并且我想使用 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 中定义,但未公开。访问该模块的唯一方法似乎是通过 rb_const_get(或者修改 gc.c 并构建 ruby​​,但没有人愿意这样做)。

关于c - 如何在没有 rb_string_eval 的情况下使用 C API 调用 ObjectSpace.each_object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43705163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com