3

README.EXT ドキュメント (Ruby プラットフォーム ソースに付属) ではrb_define_variable、C ポインターを受け取り、VALUEそれを Ruby グローバル変数に "接続" することに言及しているため、Ruby ランドから変数を読み書きすると、指定されたメモリ内の場所。

しかし、少し違うものが必要です。C ランドから、Ruby 内で定義および初期化されたグローバル変数にアクセスしたいのです。定義されているすべてのグローバル変数をリストする必要はありません。名前を指定してグローバル変数の値にアクセスしたいだけで、C 側からアクセスしたいのです。

他のすべてが失敗した場合、rb_eval_string(Ruby と同じeval) を使用できることはわかっていますが、もっと良い方法があるはずです!

4

1 に答える 1

5

あなたが望む方法は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 では動作しません)。

于 2012-10-11T00:07:15.790 に答える