Выполнение метода объекта, переданного в расширение Ruby C
Я пытаюсь написать расширение Ruby на C, и у меня возникла проблема с вызовом метода объекта, который передается в расширение.
Например, у меня есть класс 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)
Я получаю ответ: "регистратор НЕ отвечает на запись"
Я уверен, что здесь не хватает какой-то тонкой проблемы, так как я ожидал, что регистратор сможет ответить на запрос на запись.
В глубине души я чувствую, что параметр 'VALUE logger' описывает только указатель, а не описывает logger как объект с методами.
Любые идеи с благодарностью. Спасибо!