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);