用c - 模块扩展Ruby返回奇怪的值,请解释一下......

时间:2012-11-25 00:37:19

标签: c ruby irb

我正在测试c-extended 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

...我得到的是7而不是15。有人可以解释一下这里发生的事情吗?

1 个答案:

答案 0 :(得分:2)

行;在尝试返回字符串并获得转储后,我终于明白了...... ^^

我的错是没有仔细阅读文档(特别是ruby.h中的宏):返回15,Ruby得到0xF,它设置了LSB。因此,它会看到一个fixnum,它通过向右移动一点来获得它的值,因此它以0x7结束。通过返回INT2FIX(15)而非15,这将得到解决。