2015-06-10 72 views
3

我正面臨着在C中調用mruby VM的問題。我可以調用mruby vm並從C執行ruby代碼。我也可以觸發定義在紅寶石代碼以及。但是我在嘗試讀取ruby方法的返回值時遇到了問題。我在下面提供了我的示例場景。通過C讀取mruby程序的'返回'值通過C

CODE:

#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),你能幫我嗎?

問候,

回答

1

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); 

然後解析器和代碼生成器將無法使用,因此這將是更快,除非他們在其他地方使用,可執行Ø r(共享)庫也將小得多。加mrb_undef_value()不是可能的返回值,否則檢查未捕獲的異常並檢索返回值可以以相同的方式完成。

+0

,我試過了mrb_funcall,但我不知道如何傳遞參數。另外mrb_funcall沒有爲我工作。你能給我一個例子,可以調用'helloworld'並傳遞一個參數(例如:'test',123)並讀取返回值嗎?這是我的要求。也感謝代碼片段和解釋。 – programmer

+1

@programmer:'mrb_funcall(mrb,mrb_top_self(mrb),「helloworld」,2,mrb_str_new_cstr(mrb,「test」),mrb_fixnum_value(123));' – cremno

+0

謝謝,以及如何讀取返回值我回來了'OK')。 – programmer