У меня есть массив (может быть больше, чем один массив) в C. Мне нужно создать интерфейс, чтобы ruby мог изменять / читать значения массива.Я собираю ruby-модули в C, чтобы они потом использовались в ruby.
C-файл:
#include <ruby.h>
VALUE ParentModule;
uint8 variable = 7;
uint8 array[2];
VALUE get_variable(VALUE self)
{
return INT2NUM(variable);
}
VALUE set_variable(VALUE self, VALUE x)
{
variable = NUM2UINT(x);
return Qnil;
}
void Init_extension(void)
{
ParentModule = rb_define_module("ParentModule");
rb_define_method(ParentModule, "variable", get_variable, 0);
rb_define_method(ParentModule, "variable=", set_variable, 1);
}
Ruby-файл:
class Thing
def initialize
extend ParentModule
end
end
c = Thing.new
c.variable #=> will return the value 7
c.variable= 10 #=> will write 10 to variable in the C section.
c.variable #=> returns 10
Так что все это прекрасно работает, но теперь мне нужно иметь возможность сделать то же самое с массивом.То, что я пытался:
C файл:
VALUE get_array_0(VALUE self)
{
return INT2NUM(array[0]);
}
VALUE set_array_0(VALUE self, VALUE x)
{
array[0] = NUM2UINT(x);
return Qnil;
}
/* this line is inside Init_extension function */
rb_define_method(ParentModule, "array[0]", get_array_0, 0);
То, что я пытаюсь сделать, это назвать метод set / get, чтобы создать впечатление в ruby, что я "использую" массив, когдаэто просто интерфейс для взаимодействия с массивом, который существует в C. Файл C компилируется нормально, но когда я пытаюсь вызвать метод из Ruby, он жалуется, говоря, что «массив» не является методом
Ruby:
c = Thing.new
c.array[0] #=> NoMethodError (undefined method `array' for #<Thing:0x00000234523>)
Каков наилучший способ добиться этого?(Это должно работать и для двумерных массивов)
ПРИМЕЧАНИЕ. Пожалуйста, отредактируйте мой вопрос, если найдете какую-либо информацию избыточной.