2012-10-10 2 views
3

Ruby 플랫폼 소스와 함께 제공되는 README.EXT 문서에는 VALUE에 대한 C 포인터를 가져 와서 Ruby 전역 변수에 "연결"하여 Ruby-land에서 변수를 읽고 쓰는 것 (rb_define_variable)이 언급되어 있습니다 메모리의 지정된 위치에 액세스합니다.내부 C API를 사용하여 Ruby 전역 변수를 읽는 방법?

하지만 조금 다른 것이 필요합니다. C-land에서 루비에서 정의되고 초기화 된 전역 변수에 액세스하려고합니다. 정의 된 모든 전역 변수를 나열 할 필요는 없습니다. 단지 이름을 가진 전역 변수의 값에 액세스하기를 원하며 C 측에서 수행하려고합니다.

다른 모든 방법이 실패 할 경우 rb_eval_string (Ruby에서 eval과 동일 함)을 사용할 수 있지만 더 좋은 방법이 있어야합니다.

답변

5

원하는 방법은 rb_gv_get (그 자체로 전역 변수 항목을 감싸는 래퍼)입니다. rubyinline하면 (rubyinline은 IRB에서 작동하지 않습니다)

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 

을 작성할 수 있습니다.

+0

니스! 감사! 나는 "글로벌"과 "변수"에 대해 grepping을 시도했지만 아무 것도 찾지 못했습니다 ... –

관련 문제