Groovy:x27的含义;这';封闭内部
下面的示例改编自“Groovy正在运行”Groovy:x27的含义;这';封闭内部,groovy,closures,Groovy,Closures,下面的示例改编自“Groovy正在运行” class Mother { Closure birth() { def closure = { caller -> [this, caller] } return closure } } Mother julia = new Mother() closure =
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
的范围)。我这样想对吗
在闭包中计算出调用闭包的范围此
- 在上面显示的闭包中,
和此
指的是相同的范围吗调用方
不要看第144页 …这是指关闭,而不是 声明对象。在这一点上,, 闭包对我们来说是个把戏。他们 将所有方法调用委托给 所谓的委托对象,由 默认值为声明 对象(即所有者)。这个牌子 闭包看起来像是封闭的 代码在生日上下文中运行 谢谢你的提问 闭包中的这个值计算为调用闭包的范围 他们在书中说“这是指闭包,而不是声明对象” 但是从bertport和我的实验来看,“this”实际上是声明对象 不管怎样,你的问题的答案仍然是“不” 在上面所示的闭包中,this和caller引用相同的作用域 恐怕不行 请注意,Groovy中的第143页和第144页需要进行一些更正 Sake说,“这是闭包而不是构建闭包的对象。”但是当我们运行这个脚本时,我们发现这是一个母亲,而不是闭包
{
def self = ({ owner })()
}
所有者:封闭对象(this或其周围)。块中的“this
”表示在Groovy中始终(无论是普通的类Java块还是闭包)周围的类(实例)。“owner
”是闭包的属性,并指向嵌入对象,该对象要么是类(实例),然后与“this
”相同,要么是另一个闭包。我会完全忘记这部分的范围。因此,在上面的例子中,“this”指的是母亲,这是正确的
现在让事情变得复杂。。。在Groovy中,“this”和隐式this是不同的。因此,如果你有一个闭包{foo()}
和{this.foo()}
,你可以得到不同的结果this.foo()
将始终解析为嵌入类,而只有foo()
将使用Groovy元对象协议(MOP)解析,并且可以指向完全不同的内容。例如,对于标准的Groovy构建器,构建器可以在该闭包上设置委托并捕获方法调用。无论如何这就是为什么这部分被称为动态范围
历史背景:
在Groovy 1.0之前,“this”是闭包对象本身。但是被更改了,因为如果生成器捕获了所有调用,那么实际上调用
this.foo()
就不可能了。然后,您再也无法从生成器中调用本地方法了。在改变标准的解决策略方面进行了很多尝试,也进行了大量的情感讨论。但最终,将“this”改为“embedded”类是解决这个问题的一个简单方法,而且更符合来自Java的人,如果您坚持的话,它可以让您轻松绕过MOP。是的。你说得对,上下文[0]确实是母亲(朱莉娅)。这本书解释得不对。谢谢@blackdrag的解释!那么我说的对吗,在执行闭包时,不可能获得闭包本身的引用;cl={return cl};assert cl()==cl`显示了如何获取要在块内使用的引用。但如果不使用外部上下文,就不可能获得闭包的引用,这是正确的。