3

在 README.EXT 文档(随 Ruby 平台源代码一起提供)中,它提到rb_define_variable,它接受一个 C 指针VALUE并将其“连接”到一个 Ruby 全局变量,因此从 Ruby-land 读取/写入变量将访问给定的内存中的位置。

但我需要一些不同的东西:从 C 语言中,我想访问在 Ruby 中定义和初始化的全局变量。我不需要列出所有定义的全局变量——我只想访问给定名称的全局变量的值,并且我想从 C 端进行。

如果一切都失败了,我知道我可以使用rb_eval_string(这与 Ruby 中的相同eval),但应该有更好的方法!

4

1 回答 1

5

你想要的方法是rb_gv_get(它本身就是一些全局变量的包装器)。使用 ruby​​inline 你可以写

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 中不起作用)。

于 2012-10-11T00:07:15.790 回答