在 C 中读取 ruby 程序的 'return' 值
reading the 'return' value of mruby program via C
我在 C 中调用 mruby 虚拟机时遇到问题。我可以调用 mruby 虚拟机并从 C 中执行 ruby 代码。我也可以触发ruby 代码中定义的方法也是如此。但是我在尝试读取 ruby 方法的 return 值时遇到问题。我在下面提供了我的示例场景。
代码:
#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 调用 ruby 代码(使用 mruby)的人能帮帮我吗?
此致,
mrb_load_string()
的 return 值是最后计算的表达式的值。但它也是 mrb_undef_value()
解析或代码生成过程中发生的语法错误等失败。通常,如果存在未捕获的异常,mrb_state
的 exc
成员是非空的:
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()
不是可能的 return 值,否则可以用相同的方式检查未捕获的异常并检索 return 值。
我在 C 中调用 mruby 虚拟机时遇到问题。我可以调用 mruby 虚拟机并从 C 中执行 ruby 代码。我也可以触发ruby 代码中定义的方法也是如此。但是我在尝试读取 ruby 方法的 return 值时遇到问题。我在下面提供了我的示例场景。
代码:
#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 调用 ruby 代码(使用 mruby)的人能帮帮我吗?
此致,
mrb_load_string()
的 return 值是最后计算的表达式的值。但它也是 mrb_undef_value()
解析或代码生成过程中发生的语法错误等失败。通常,如果存在未捕获的异常,mrb_state
的 exc
成员是非空的:
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()
不是可能的 return 值,否则可以用相同的方式检查未捕获的异常并检索 return 值。