Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Вызов метода класса на C++ из скрипта на Ruby


Автор: BodyHolly 3.3.2007, 01:04
Всем привет!

Столкнулся с задачей:
есть класс на С++, есть метод этого класса, возвращающий некоторое значение

Нужно написать скрипт на ruby, вызывающий этот метод класса и получить вычисленное значение метода

Посмотрел SWIG... А попроще вызов сделать нельзя?

Очень надеюсь на совет!

Автор: max_lapshin 3.3.2007, 12:49
О. Я тебе, как автор 4 экстеншнов, про это могу рассказать.
Смотри: в C++ метод на объекте вызывается не волшебным образом, а через таблицу виртуальных функций (в общем случае). Ее поддержки в руби, есессно, нет. 

Решается это так: создается статическая функция, которая будет проксировать обращение к C++-методу.


Код

class A {
  int method(int param);
};

#define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f)

static void a_delete(A* a) {
  delete a; //обязательно так, иначе будет вызван free на памяти, полученной через new.
}
static VALUE a_allocate(VALUE klass) {
  A* a = new A();
  return Data_Wrap_Struct(klass, 0, a_delete, a);
}

static VALUE a_method(VALUE self, VALUE param) {
  A* a;
  Data_Get_Struct(self, A, a);
  return INT2NUM(a->method(NUM2INT(param))); // param разворачивается в int, передается методу, результат заворачивается в тип руби
}

VALUE cA; // Здесь хранится сам класс A, который будет жить в руби

void Init_A () {
  cA = rb_define_class("A", rb_cObject); // объявляется класс в руби
  rb_define_alloc_func(cA, a_allocate); // объявляется функция его аллокации
  rb_define_method(cA, "method", VALUEFUNC(a_method), 1); // объявляется метод экземпляра класса
}

Автор: BodyHolly 3.3.2007, 15:13
Спасибо :-) Интересный способ

Автор: max_lapshin 3.3.2007, 15:55
А другого способа нет чисто теоретически. SWIG к этому же сводит, но свиг — это способ к которому у меня много претензий.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)