2012-11-25 2 views
0

현재 C 확장 루비를 테스트 중입니다. 다음 테스트 모듈을 컴파일하고 설치됩니다 :c 모듈로 Ruby를 확장하면 이상한 값이 반환됩니다. 설명해주십시오 ...

# include "ruby.h" 

static VALUE t_init(VALUE self) 
{ 
    return self; 
} 

static VALUE t_check(VALUE self) 
{ 
    return 15; 
} 

VALUE Qmodule; 
VALUE FlagValueClass; 

void Init_Flags() 
{ 
    Qmodule = rb_define_module("Q"); 
    FlagValueClass = rb_define_class_under(Qmodule, "Flags", rb_cObject); 
    rb_define_method(FlagValueClass, "initialize", t_init, 0); 
    rb_define_method(FlagValueClass, "check", t_check, 0); 
} 

을하지만 IRB에로드 할 때 :

1.9.3-p286 :002 > require 'Q/Flags' 
=> true 
1.9.3-p286 :003 > a = Q::Flags 
=> Q::Flags 
1.9.3-p286 :004 > a = Q::Flags.new 
=> #<Q::Flags:0x00000001fa78e0> 
1.9.3-p286 :005 > puts a.check() 
=> 7 

을 ... 내가 대신 내가 기대 15 느릅 나무의 7를 얻을. 누군가 여기서 무슨 일이 일어 났는지 설명해 주시겠습니까?

답변

2

OK; 문자열을 반환하고 덤프를 얻으려고 시도한 후에 마침내 알게되었습니다. ^^

내 잘못은 문서 (특히 ruby.h의 매크로)를주의 깊게 읽지 못했습니다. 15를 반환하면 Ruby는 LSB가있는 0xF 세트. 따라서 fixnum이 하나의 비트만큼 오른쪽으로 이동하여 값을 얻습니다. 따라서 0x7으로 끝납니다. 15 대신 INT2FIX(15)을 반환하면 해결됩니다.