我知道这就是闭包的用途,但下面的工作也不应该这样吗?:
def f = 'foo' def foo() { println(f) } foo()
它导致:
Caught: groovy.lang.MissingPropertyException: No such property: f for class: bar groovy.lang.MissingPropertyException: No such property: f for class: bar at bar.foo(bar.groovy:4) at bar.run(bar.groovy:7)
解决方法
在一个groovy脚本(而不是类)中,您的代码基本上等同于:
class ScriptName { def main(args) { new ScriptName().run(args) } def run(args) { def f = 'foo' foo() } def foo() { println(f) } }
由groovy为groovy脚本创建的’隐式’封闭类始终存在但在代码中不可见.上面说明了为什么foo方法没有看到f变量.
你有几个选择
选项1 – 绑定
有关详细信息,请参阅groovy docs on script bindings.
// put the variable in the script binding f = 'foo'
这是简写:
binding.setVariable('f','foo')
对于groovy脚本,脚本绑定在任何地方都可见,这使得变量基本上是“全局的”.
选项2 – @Field注释
有关详情,请参阅groovy docs on the Field annotation.
import groovy.transform.Field ... // use the groovy.transform.Field annotation @Field f = 'foo'
Field注释专门用于为groovy脚本提供向“隐式”封闭类添加字段的功能.生成的类看起来如下所示:
class ScriptName { def f = 'foo' def main(args) { new ScriptName().run(args) } def run(args) { foo() } def foo() { println(f) } }
这也基本上使变量可以在脚本中“全局”访问.