2013-11-26 36 views
0

有效地,我想知道如果我可以,純粹通過使用Ruby的C庫,追加到$ LOAD_PATH。 這樣做的理由是我有一個書面的擴展名(使用Rice,但這不是非常重要的),我希望它可以與其他幾個人在自己的目錄中自成一體。

現在,我已經有兩個工作解決方案,我很好。首先,我只是使用由Rice生成的Makefile將共享對象自動安裝到已經在$ LOAD_PATH上的標準目錄中。超級簡單沒有麻煩。另一個是我在運行之前導出$ RUBY_LIB作爲我想要的目錄,Ruby運行時就像冠軍一樣挑選出來。但我想知道的是,如果我可以只在C做到這一點 - 參考我要尋找功能,可以模擬ruby -I./somedir

現在我初始化紅寶石在C以下的方式,這正常工作與前面提到的工作解決方案,但我想要的是在運行時乾淨地添加一個目錄到Ruby的$ LOAD_PATH的方法。

ruby_sysinit(&argc, &argv); 
RUBY_INIT_STACK; 
ruby_init(); 
ruby_init_loadpath(); 
.... 
rb_load_protect(...) 
rb_funcall(...) 

我無法弄清楚如何與ruby_options工作,它只是給了我一個節點,然後阻塞主線程,所以我不能做任何事情;是我用它錯了嗎?

謝謝!

回答

1

要訪問加載變量$LOAD_PATH,請在代碼中使用rb_gv_get("$LOAD_PATH")

rb_gv_get("$LOAD_PATH")返回一個Ruby陣列對象,因此可以使用任何C數組函數,如rb_ary_unshiftrb_ary_push

例如:

VALUE load_path = rb_gv_get("$LOAD_PATH"); 
/* add a directory to Ruby's $LOAD_PATH */ 
rb_ary_push(load_path, rb_str_new2("any expanded directory")); 
+0

我認爲這是最好的解決方案,謝謝。我希望有一個頂級的方法來做到這一點,但這完全按照需要工作。 – cleversoap

+0

@cleversoap在內部,'$ LOAD_PATH'常量使用'rb_define_hooked_variable'函數進行註冊,該函數註冊一個getter方法。當你使用'rb_gv_get'時,你已經在使用適當的getter函數。 –

相關問題