我知道这就是闭包的用途,但下面也不应该这样做吗?:
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)
答案 0 :(得分:8)
在一个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)
}
}
这也基本上使得变量可以全球访问'在脚本中。