我想允许在类似shell的应用程序中评估代码。只需按一下按钮,即可评估代码,并向用户显示结果。我想这样做,如果他再次评估代码,旧评估中定义的所有内容将不再存在。例如,假设这是eval#1:
puts "Hello world"
user_variable1 = 10
$USER_VARIABLE2 = 20
我希望在eval#2上,user_variable1
和$USER_VARIABLE2
的值不存在。这就是我想在每次运行中使用某种上下文的原因。但是,我不知道在哪里寻找更多信息。
答案 0 :(得分:3)
您可以使用某种方式执行命令,在另一个进程中运行另一个(或相同的脚本)。像
这样的东西system('myscript.rb')
或
`myscript.rb`
这将确保清除所有变量,但环境变量当然是相同的。但是,从ruby 1.9开始,你也可以重置它们。像这样:
system('myscript.rb', :unsetenv_others => true)
如果你想要一个非常接近eval()
函数的东西,你可以创建一个eval.rb
,它只会评估第一个参数,然后定义一个evalExt
函数:
eval.rb:
eval(ARGV[0])
然后在你的另一个脚本中: def evalExt(脚本) system(“eval.rb \”#{script} \“”,:unsetenv_others => true) 端
evalExt('puts "test"')
evalExt('puts "test1"')
在JRuby的情况下,您应该能够轻松地调用另一个ruby引擎,方法是从JRuby调用Java代码,然后使用Wikipedia中描述的ScriptEngineManager
:
require 'java'
mgr = ScriptEngineManager.new();
rbEngine = mgr.getEngineByExtension("rb");
def evalExt(script)
rbEngine.eval(script);
end
也许您必须确保重置脚本上下文或绑定(see this article)。
所有这一切,也许最简单的解决方案就是确保没有设置全局变量,那么你根本就不必分离上下文。