Как получить экземпляр класса Ruby, работающий в текущем файле RB? (Встраивание Ruby в C ++) - PullRequest
1 голос
/ 30 января 2009

Я встроил Ruby в свое приложение C ++. Я сгенерировал привязки с помощью SWIG.

По сути, я запускаю файл ruby, а затем Ruby вступает во владение и вызывает мой класс C ++.

Исходя из моего предыдущего вопроса, я хотел бы вернуть текущий экземпляр класса, который определен в файле ruby, обратно в класс C ++, чтобы я мог выполнять методы экземпляра.

Я выполняю файл ruby ​​следующим образом:

rb_eval_string_protect(<ruby script string>, &status );

rb_funcall(Qnil, rb_intern("main"), 0);

Глобальный метод main в скрипте создает экземпляр определенного класса в файле. Это тот случай, за которым я следую.

Если потребуется, я добавлю параметр или другую функцию для передачи экземпляра обратно, однако я не уверен, как определить это в C ++, чтобы при генерации привязки SWIG все работало нормально. *

Любая помощь будет оценена.

Предыдущий вопрос: Вызов методов класса Ruby из C ++

1 Ответ

1 голос
/ 31 января 2009

C api для ruby ​​делает все возможное, чтобы сохранить функциональную природу ruby, поэтому rb_eval_string_protect() возвращает VALUE последней строки данного скрипта, а rb_funcall() возвращает VALUE последней строки вызванного метода.

Таким образом, хитрость в том, чтобы думать об этом как о том, как получить значение экземпляра в чистом рубине? Если это просто возвращаемое значение main, например

# I'm a ruby script!
main_retval = main()

Тогда получение возвращаемого значения в C аналогично:

// I'm some C (or C++) code
VALUE main_retval;
// ...
rb_eval_string_protect("...", &status);
main_retval = rb_funcall(Qnil, rb_intern("main"), 0);

И даст вам ссылку на объект ruby, возвращаемый main.

Вы можете использовать этот объект как обычно, вызывая методы и т.п.

VALUE main_retval_as_string = rb_funcall(main_retval, rb_intern("to_s"), 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...