Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c–扩展Ruby;模块返回奇怪值,请解释…;_C_Ruby_Irb - Fatal编程技术网

用c–扩展Ruby;模块返回奇怪值,请解释…;

用c–扩展Ruby;模块返回奇怪值,请解释…;,c,ruby,irb,C,Ruby,Irb,我目前正在测试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(&

我目前正在测试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
1.9.3-p286:002>要求“Q/标志”
=>正确
1.9.3-p286:003>a=Q::标志
=>Q::标志
1.9.3-p286:004>a=Q::Flags.new
=> #
1.9.3-p286:005>放置a.检查()
=> 7

…我得到的是
7
,而不是我所期望的
15
。有人能解释一下这里发生了什么吗;在尝试返回字符串并得到转储后,我终于得到了它^^

我的错误是没有仔细阅读文档(尤其是
ruby.h
中的宏):通过返回15,ruby获得了设置了LSB的
0xF
。因此,它看到一个fixnum,它通过将其右移一位来获取其值,因此它以
0x7
结尾。通过返回
INT2FIX(15)
而不是只返回
15
,可以解决这个问题