我怎样才能在每次新环境中评估JRuby中的代码?

时间:2011-09-03 11:13:20

标签: jruby

我想允许在类似shell的应用程序中评估代码。只需按一下按钮,即可评估代码,并向用户显示结果。我想这样做,如果他再次评估代码,旧评估中定义的所有内容将不再存在。例如,假设这是eval#1:

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

我希望在eval#2上,user_variable1$USER_VARIABLE2的值不存在。这就是我想在每次运行中使用某种上下文的原因。但是,我不知道在哪里寻找更多信息。

1 个答案:

答案 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)。

所有这一切,也许最简单的解决方案就是确保没有设置全局变量,那么你根本就不必分离上下文。