阅读'返回'通过C的mruby程序的价值

时间:2015-06-10 02:31:42

标签: c mruby

我遇到了在C中调用mruby VM的问题。我可以调用mruby vm并从C执行ruby代码。我也可以触发ruby代码中定义的方法。但是在尝试读取ruby方法的返回值时我遇到了问题。我在下面提供了我的示例场景。

CODE:

#include <stdlib.h>
#include <stdio.h>

#include <mruby.h>
#include <mruby/compile.h>

int main(void)
{
  mrb_state *mrb = mrb_open();
  char code[] = "def helloworld() return'OK' end";
  printf("Executing Ruby code from C!\n");

  mrb_load_string(mrb, code);
  mrb_load_string(mrb, "helloworld()");
  // How to read the return value?
  return 0;
}

我不确定这是否是调用ruby方法的正确方法?我无法在网上找到任何文档或示例。任何尝试通过c(使用mruby)调用ruby代码的人都可以帮助我吗?

此致

1 个答案:

答案 0 :(得分:2)

mrb_load_string()的返回值是最后一次计算的表达式的值。但是在解析或代码生成过程中发生的失败也是mrb_undef_value(),如语法错误。通常,如果存在未捕获的异常,则exc的{​​{1}}成员为非null:

mrb_state

如果您只想调用方法,可以使用mrb_value rv = mrb_load_string(mrb, "helloworld()"); if (mrb->exc) { // if uncaught exception … if (!mrb_undef_p(rv)) { // … during execution/run-time mrb_print_error(mrb); // write backtrace and other details to stderr } } else { mrb_p(mrb, rv); // similar to Kernel#p } 系列函数:

mrb_funcall()

或者:

mrb_value rv = mrb_funcall(mrb, mrb_top_self(mrb), "helloworld", 0);

然后解析器和代码生成器不会被使用,因此它会更快,除非它们在其他地方使用,否则可执行文件或(共享)库也会更小。加mrb_value rv = mrb_funcall_argv(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, "helloworld"), 0, NULL); 不是可能的返回值,否则检查未捕获的异常并检索返回值可以用同样的方式完成。