首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C读取mruby程序的“返回”值

通过C读取mruby程序的“返回”值
EN

Stack Overflow用户
提问于 2015-06-10 02:31:42
回答 1查看 349关注 0票数 3

我在C中调用mruby时遇到了一个问题,我可以调用mruby并从C执行ruby代码,我还可以触发ruby代码中定义的方法。但是,当我试图读取红宝石方法的返回值时,我面临着一些问题。我在下面提供了我的示例场景。

代码:

代码语言:javascript
复制
#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代码的人,您能帮我吗?

致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 04:16:55

mrb_load_string()的返回值是最后一个求值表达式的值。但是,在语法分析或代码生成过程中发生的失败(比如语法错误)也是mrb_undef_value()。通常,如果存在未察觉的异常,则mrb_statemrb_state成员是非空的:

代码语言:javascript
复制
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()系列函数:

代码语言:javascript
复制
mrb_value rv = mrb_funcall(mrb, mrb_top_self(mrb), "helloworld", 0);

或者:

代码语言:javascript
复制
mrb_value rv = mrb_funcall_argv(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, "helloworld"), 0, NULL);

然后解析器和代码生成器就不会被使用,因此它会更快,除非它们在其他地方使用,否则可执行文件或(共享)库也会小得多。另外,mrb_undef_value()并不是一个可能的返回值,否则,检查不确定的异常并检索返回值也可以用相同的方式完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30746108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档