您可以使用某種執行命令的方式在另一個進程中運行另一個(或相同的腳本)。像
system('myscript.rb')
或
`myscript.rb`
這將確保所有的變量都被清除的東西,但是,環境變量當然是相同的。但是從ruby 1.9開始,你也可以重置它們。像這樣:
system('myscript.rb', :unsetenv_others => true)
如果你想要的東西非常接近eval()
功能,您可以創建一個eval.rb
,這將只是評估第一個參數,然後定義evalExt
功能:
eval.rb:
eval(ARGV[0])
,然後在其他腳本: 高清evalExt(腳本) 系統( 「eval.rb \」 #{}腳本\ 「」:unsetenv_others =>真) 結束
evalExt('puts "test"')
evalExt('puts "test1"')
在JRuby中的情況下,對Wikipedia描述你應該能夠那麼容易調用另一個紅寶石引擎,通過調用JRuby的Java代碼,然後使用ScriptEngineManager
:你
require 'java'
mgr = ScriptEngineManager.new();
rbEngine = mgr.getEngineByExtension("rb");
def evalExt(script)
rbEngine.eval(script);
end
也許將不得不確保重置腳本上下文或綁定(see this article)。所有這一切說,也許最簡單的解決方案將是確保沒有設置全局變量,那麼你根本不必分離上下文。
好的,但如果我從一個自帶的JRuby jar中運行它,該怎麼辦?我不會有Ruby的路徑,並且調用另一個JRuby會太慢。 – Geo
謝謝!它很漂亮! – Geo