首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用call调用ObjectSpace.each_object而不使用rb_string_eval?

如何使用call调用ObjectSpace.each_object而不使用rb_string_eval?
EN

Stack Overflow用户
提问于 2017-04-30 09:58:20
回答 1查看 67关注 0票数 0

我目前正在尝试获取类的所有实例,我希望使用ObjectSpace.each_object来实现这一点。

下面是我在C中的实际代码:

代码语言:javascript
复制
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更好吗?(我认为是因为解析器的缘故)
  • 由于ObjectSpace似乎不存在,我如何在can中检索rb_mObjectSpace模块?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-30 10:57:55

我找到了怎么做的。它使用的是rb_const_get

下面是代码:

代码语言:javascript
复制
VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43705163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档