我在C中调用mruby时遇到了一个问题,我可以调用mruby并从C执行ruby代码,我还可以触发ruby代码中定义的方法。但是,当我试图读取红宝石方法的返回值时,我面临着一些问题。我在下面提供了我的示例场景。
代码:
#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;
}我不确定这是不是叫红宝石方法的正确方式?我在网上找不到任何文档或例子。任何试图通过c(使用mruby)调用ruby代码的人,您能帮我吗?
致以敬意,
发布于 2015-06-10 04:16:55
mrb_load_string()的返回值是最后一个求值表达式的值。但是,在语法分析或代码生成过程中发生的失败(比如语法错误)也是mrb_undef_value()。通常,如果存在未察觉的异常,则mrb_state的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);然后解析器和代码生成器就不会被使用,因此它会更快,除非它们在其他地方使用,否则可执行文件或(共享)库也会小得多。另外,mrb_undef_value()并不是一个可能的返回值,否则,检查不确定的异常并检索返回值也可以用相同的方式完成。
https://stackoverflow.com/questions/30746108
复制相似问题