2011-09-03 40 views
1

我想允許在類似殼的應用程序中評估代碼。在按下按鈕時,代碼將被評估並且結果將顯示給用戶。我想要做到這一點,如果他再次評估代碼,舊評估中定義的所有內容都將不再存在。例如,假設這是EVAL#1:如何在每次新的上下文中評估JRuby中的代碼?

puts "Hello world" 
user_variable1 = 10 
$USER_VARIABLE2 = 20 

我想,關於EVAL#2,不存在的user_variable1$USER_VARIABLE2值。這就是爲什麼我想在每次運行中使用某種上下文的原因。但是,我不知道在哪裏尋找更多信息。

回答

3

您可以使用某種執行命令的方式在另一個進程中運行另一個(或相同的腳本)。像

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)。所有這一切說,也許最簡單的解決方案將是確保沒有設置全局變量,那麼你根本不必分離上下文。

+0

好的,但如果我從一個自帶的JRuby jar中運行它,該怎麼辦?我不會有Ruby的路徑,並且調用另一個JRuby會太慢。 – Geo

+0

謝謝!它很漂亮! – Geo

相關問題