gpt4 book ai didi

groovy - 在 Trait 中调用时如何正确使用闭包委托(delegate)

转载 作者:行者123 更新时间:2023-12-04 21:09:03 26 4
gpt4 key购买 nike

我有一个 Groovy 特征,它需要提供一个配置闭包作为库方法调用的参数(它是 HttpBuilder,但没关系)。

为了重现该问题,我创建了以下简单示例:

trait T {
def doIt() {
return {
n = 1
}
}
}

class Delegate {
int n
}

class Tish implements T {
def go() {
def closure = doIt()
def d = new Delegate()
closure.delegate = d
closure()
assert d.n == 1
}
}

new Tish().go()

预计这将无错误地运行,因为当 doIt() 返回的闭包时 T 中的方法运行 trait,它的委托(delegate)被设置为可以设置 n变量为 1....

但是,这不起作用,我收到此错误:
 groovy.lang.MissingPropertyException: No such property: n for class: Tish

如果我制作 T一个类,让 Tish而是扩展它,然后它就可以工作了!

我尝试更改 Closure 的委托(delegate)策略,但这并没有帮助。

这是一个 Groovy 错误还是有办法解决这个问题?

最佳答案

好吧,我找到了一种解决方法......不过,如果这是否是一个错误,以及如果是,Groovy 团队何时修复它,将会很有趣!

更新 : this is a bug并希望在不久的将来在 Groovy 版本中得到修复!

在配置闭包中进行的所有调用都可以通过调用 getDelegate() 来获取实际的 Delegate 对象。方法,然后直接在其上设置所有属性,如下所示:

return {
def d = getDelegate()
d.n = 1
}

不理想,但让我陷入困境,希望它可以帮助其他人......

编辑:
正如@bdkosher 在评论中指出的那样,另一种解决方案是在闭包中使用setter 语法:
return {
setN 1
}

关于groovy - 在 Trait 中调用时如何正确使用闭包委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997392/

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