Groovy方法无法访问封闭范围中的变量

时间:2017-02-08 15:13:34

标签: groovy

我知道这就是闭包的用途,但下面也不应该这样做吗?:

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)

1 个答案:

答案 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)
  }
}

这也基本上使得变量可以全球访问'在脚本中。