执行传递给Ruby C扩展的对象的方法

时间:2016-08-09 14:14:43

标签: c ruby ruby-c-extension

我正在尝试在C中编写Ruby扩展,并且在调用传递给扩展的对象的方法时遇到问题。

例如,我有一个ruby类定义如下:

class MyClass
  def write(message)
    ...do a write...
  end
end

扩展名定义为:

#include "ruby.h"
static VALUE _init(VALUE self, VALUE logger)
{
  switch (TYPE(logger))
  {
    case T_OBJECT:
      ID method = rb_intern("write");
      if (rb_respond_to(logger, method))
        fputs("logger responds to write\n", stderr);
      else
        fputs("logger does NOT respond to write\n", stderr);
      break;
    default:
      fputs("logger not an object\n", stderr);
  }
  return self;
}

void Init_MyExt()
{
  VALUE MyExt_class = rb_define_class("MyExt", rb_cObject);
  rb_define_method(MyExt_class, "initialize", _init, 1);
}

执行调用的ruby脚本类似于:

require 'MyExt.so'
@log = MyClass.new()
@myext = MyExt(@log)

我得到的回答是:"记录器不响应写"

我确信我在这里遗漏了一些微妙的问题,因为我原本希望记录器能够响应写请求。

在我的脑海里,我觉得这个“值”记录器'参数仅描述指针而不是将logger描述为具有方法的对象。

非常感谢任何见解。谢谢!

0 个答案:

没有答案