Во-первых, go
- это, как вы определили, не метод класса, а метод экземпляра .
Как объектно-ориентированный язык, все методы ruby требуют приемника, то есть объекта, для которого вызывается метод. Для методов экземпляра получатель является экземпляром класса, для методов класса получатель является самим объектом класса.
? заполнитель у вас есть слот для получателя вызова метода.
Если вы хотите оставить его как метод экземпляра, то вам нужно сделать это:
rb_funcall(a_CallTest_instance, rb_intern("go"), 0);
где a_CallTest_instance
был экземпляром CallTest, который вы создали с помощью rb_class_new_instance()
.
Если вы сделаете это методом класса:
class CallTest
def self.go
# ...
end
end
Тогда вам нужно использовать сам класс CallTest
в качестве получателя:
rb_funcall(klass, rb_intern("go"), 0);
Вы можете получить ссылку на класс CallTest
, используя rb_const_get()
VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));
Используйте rb_cObject
там, поскольку CallTest
определено в глобальном контексте.
Я бы предложил прочитать главу кирки о расширении рубина.