我正在构建一个基于 groovy 的工具,作为一个插件,我想提供一个交互式命令行,我已经部分工作了,但是绑定(bind)没有保持 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
最佳答案
shell.evaluate("def a = 20");
您只需要a = 20
,而不是def a = 20
。每个evaluate
调用都会解析并编译一个单独的脚本,并且声明(无论是使用def
还是使用int a = 20
等显式类型)都会成为该特定脚本中的局部变量,并且不会在绑定(bind)中存储任何内容。如果没有 def
,您就可以对一个未声明的变量进行简单的赋值,该变量将进入绑定(bind),因此对以后的 evaluate
调用可见。
关于java - 如何为交互式 session 创建有状态的 Groovy 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217976/