gpt4 book ai didi

Groovy:闭包内 'this' 的含义

转载 作者:行者123 更新时间:2023-12-04 02:49:13 26 4
gpt4 key购买 nike

以下示例改编自“Groovy in Action”

class Mother {

Closure birth() {
def closure = { caller ->
[this, caller]
}
return closure
}
}

Mother julia = new Mother()
closure = julia.birth()
context = closure.call(this)

println context[0].class.name // Will print the name of the Script class
assert context[1] instanceof Script

根据书, this 的值闭包内部是最外层范围(即声明 julia 的范围)。我是否正确地假设
  • this在闭包内部计算闭包被调用的范围?
  • 在上面显示的闭包内,thiscaller指的是同一个范围?

  • 谢谢,
    大学教师

    最佳答案

    this”在 Groovy 中的 block 中总是意味着周围的类(实例)(无论是普通的 Java 类 block 还是闭包)。 “owner ”是闭包的一个属性,指向嵌入对象,它要么是一个类(实例),然后与“this ”相同,要么是另一个闭包。我会完全忘记这部分的范围。所以在上面的例子中,“这个”指的是一位母亲是正确的。

    现在让事情变得复杂......“this”和隐含的 this 在 Groovy 中是不一样的。所以如果你有一个闭包{foo()}{this.foo()}你可以得到不同的结果。 this.foo()将始终解析为嵌入类,而只有 foo()将使用 Groovy 元对象协议(protocol) (MOP) 解决,并且可以指向完全不同的东西。例如,对于标准的 Groovy 构建器,构建器可以在该闭包上设置一个委托(delegate)并捕获方法调用。无论如何......这就是为什么这部分被称为动态范围。

    历史背景:
    在 Groovy 1.0 之前,“this”是 Closure 对象本身。但因实际调用 this.foo() 而被更改如果构建器确实捕获了所有调用,则变得不可能。那么您将无法再从构建器中调用本地方法。有很多尝试改变标准解决策略 - 也有很大的情感讨论。但最后,将“this”更改为引用嵌入类是解决问题的一个简单方法,并且更符合来自 Java 的人,而且如果您坚持,它可以让您轻松绕过 MOP。

    关于Groovy:闭包内 'this' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820084/

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