0

現在、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

7代わりに、15私が期待するものを手に入れます。誰かがここで何が起こっているのか説明してもらえますか?

4

1 に答える 1

2

わかった; 文字列を返そうとしてダンプを取得した後、私はついにそれを取得しました…^^

私のせいは、ドキュメント(特にのマクロruby.h)を注意深く読まなかったことです。15を返すことで、Rubyは0xFLSBが設定されています。したがって、fixnumが表示され、1ビット右にシフトして値を取得するため、で終了し0x7ます。INT2FIX(15)だけでなく戻ることで15、これは解決されます。

于 2012-11-25T01:23:17.040 に答える