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)

解决方法

在一个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)
  }
}

这也基本上使变量可以在脚本中“全局”访问.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...