我正在构建一个基于groovy的工具,作为一个加载项,我想提供一个交互式命令行,我有部分工作,但绑定不会在GroovyShell.evaluate()
调用之间保持状态,我已经浏览了groovy文档,并且他们使用了一个名为InteractiveGroovyShell
的类的示例,该类在2.0.x版本上不可用。
有没有办法配置普通的groovy shell来实现这个功能?
以下是我现在正在创建groovy shell的简化版本:
CompilerConfiguration config = new CompilerConfiguration();
Binding binding = new Binding();
shell = new GroovyShell(binding, config);
shell.evaluate("def a = 20");
shell.evaluate("println a"); //this throws an exception telling the variable does not exist
答案 0 :(得分:1)
shell.evaluate("def a = 20");
而不是def a = 20
,而只需要a = 20
。每个evaluate
调用解析并编译一个单独的脚本,声明(无论是def
还是显式类型,如int a = 20
)成为该特定脚本中的局部变量,并且 not 在绑定中存储任何内容。如果没有def
,您可以对一个未声明的变量进行简单分配,该变量将进入绑定,因此可以在以后的evaluate
次调用中看到。
答案 1 :(得分:0)
您应该为不同的shell重复使用相同的binding
。绑定本身将保持状态:
import org.codehaus.groovy.control.CompilerConfiguration
def binding = new Binding()
def shell = new GroovyShell(binding)
shell.evaluate("a = 5")
assert binding.variables == [a:5]
shell.evaluate("println a; b = 6")
assert binding.variables == [a:5, b:6]
def shell2 = new GroovyShell(binding)
// even in a new shell the binding keep the state
shell2.evaluate("c = 7")
assert binding.variables == [a:5, b:6, c:7]
在groovy 2.0.5中工作