c - 如何使用内部 C API 读取 Ruby 全局变量?

标签 c ruby

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

但我需要一些不同的东西:在 C 领域,我想访问在 Ruby 中定义和初始化的全局变量。我不需要列出所有已定义的全局变量——我只想访问给定名称的全局变量的值,我想从 C 端执行此操作。

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

最佳答案

您想要的方法是 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 中不起作用)。

关于c - 如何使用内部 C API 读取 Ruby 全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830182/

相关文章:

c - C 中用字符串初始化的静态 char 数组

c - strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?

ruby-on-rails - Resque: worker 状态不对

ruby-on-rails - Rails 限定工资期

ruby-on-rails - Rails 可选参数

ruby - 允许 block 处理可变数量参数的干净方法是什么?

无法通过 strcpy 从参数复制到 char 数组

c - 有什么方法可以测试询问进程是否分配了地址

c - 在 Linux C 中交替同步两个进程

ruby - 有人可以解释一下这个函数是如何工作的吗?我没有收到此代码 : nums. map { |on|因子(n) }.inject(:&)