gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:52:37 24 4
gpt4 key购买 nike

我知道这就是闭包的用途,但下面的内容不应该也可以吗?:

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 - 绑定(bind)

groovy docs on script bindings详情。
// put the variable in the script binding
f = 'foo'

这是以下的简写:
binding.setVariable('f', 'foo')

对于 groovy 脚本,脚本绑定(bind)随处可见,这使得变量本质上是“全局的”。

选项 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)
}
}

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

关于Groovy 方法无法访问封闭范围内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42116876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com