【问题标题】:Extending Ruby with c – module returns strange value, please explain…用 c – 模块扩展 Ruby 返回奇怪的值,请解释...
【发布时间】:2012-11-25 00:37:18
【问题描述】:

我目前正在测试 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。有人可以解释一下这里发生了什么吗?

【问题讨论】:

    标签: c ruby irb


    【解决方案1】:

    好的;在尝试返回一个字符串并得到一个转储后,我终于明白了...... ^^

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多