在 README.EXT 文档(与 Ruby 平台源代码一起提供)中,它提到了 rb_define_variable
,它采用指向 VALUE
的 C 指针并将其“连接”到一个 Ruby 全局变量,因此从 Ruby 领域读取/写入变量将访问内存中的给定位置。
但我需要一些不同的东西:在 C 领域,我想访问在 Ruby 中定义和初始化的全局变量。我不需要列出所有已定义的全局变量——我只想访问给定名称的全局变量的值,我想从 C 端执行此操作。
如果一切都失败了,我知道我可以使用 rb_eval_string
(与 Ruby 中的 eval
相同),但应该有更好的方法!
最佳答案
您想要的方法是 rb_gv_get
(它本身是一些全局变量内容的包装器)。使用 rubyinline 你可以写
require 'inline'
class Foo
inline :C do |builder|
builder.c_raw_singleton <<SRC
VALUE read_global(VALUE self, VALUE *name){
return rb_gv_get(rb_string_value_cstr(name));
}
SRC
end
end
然后
$bar = 1
Foo.read_global('bar') #=> 1
(rubyinline 在 irb 中不起作用)。
关于c - 如何使用内部 C API 读取 Ruby 全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830182/