gpt4 book ai didi

c - 在C中读取ruby程序的 'return'值

转载 作者:行者123 更新时间:2023-12-02 01:36:49 25 4
gpt4 key购买 nike

我在 C 中调用 mruby VM 时遇到问题。我可以调用 mruby 虚拟机并从 C 执行 ruby​​ 代码。我也可以触发 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;
}

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

问候,

最佳答案

mrb_load_string() 的返回值是最后计算的表达式的值。但它也是 mrb_undef_value() 在解析或代码生成期间发生的失败,如语法错误。一般来说,如果有未捕获的异常,mrb_stateexc 成员是非空的:

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() 不是可能的返回值,否则可以用相同的方式检查未捕获的异常并检索返回值。

关于c - 在C中读取ruby程序的 'return'值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30746108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com