Выполнение метода объекта, переданного в расширение 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 как объект с методами.

Любые идеи с благодарностью. Спасибо!

0 ответов

Другие вопросы по тегам