1

我正在构建一个基于 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
4

2 回答 2

1
shell.evaluate("def a = 20");

而不是def a = 20你只需要a = 20. 每个evaluate调用都会解析和编译一个单独的脚本,并且声明(无论是带有def还是带有诸如 的显式类型int a = 20)成为该特定脚本中的局部变量,并且不会在绑定中存储任何内容。如果没有,def您将简单地分配给一个未声明的变量,该变量将进入绑定,因此对以后的evaluate调用可见。

于 2013-01-08T19:54:18.330 回答
0

您应该binding为不同的 shell 重复使用相同的内容。绑定本身将保持状态:

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 中工作

于 2013-01-08T15:21:07.730 回答