簡體   English   中英

通過C讀取mruby程序的“返回”值

[英]reading the 'return' value of mruby program via C

我在C中調用mruby VM時遇到問題。我可以調用mruby vm並從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_undef_value() 一般來說, exc的成員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()不是可能的返回值,否則檢查未捕獲的異常並檢索返回值可以以相同的方式完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM