以下示例改编自'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
Run Code Online (Sandbox Code Playgroud)
根据该书,this闭包内部的值是最外层的范围(即julia声明的范围).我是否正确地假设
this 在闭包内部是否计算了调用闭包的范围?this并caller参考相同的范围?谢谢,唐
bla*_*rag 10
" this"在块中意味着Groovy总是(无论是普通的类似Java的块还是Closure)周围的类(实例)." owner"是Closure的一个属性,并指向嵌入对象,它是一个类(实例),然后与" this" 相同,或另一个Closure.我会完全忘记这部分的范围.因此,在上述情况下,这是正确的,"这个"指的是母亲.
现在让事情变得复杂......"这个"和Groovy中隐含的这一点并不相同.因此,如果你有一个关闭{foo()},{this.foo()}你可以得到不同的结果.this.foo()将始终解析为嵌入类,而只foo()使用Groovy元对象协议(MOP)解析并且可以指向完全不同的东西.对于标准的Groovy构建器,构建器可以例如在该Closure上设置委托并捕获方法调用.无论如何......这就是为什么这部分被称为动态范围.
历史背景:在Groovy 1.0之前"this"是Closure对象本身.但是被改变了,因为this.foo()如果建造者确实捕获了所有呼叫,实际上呼叫变得不可 然后你无法再从构建器中调用本地方法.有很多尝试改变了标准的解决策略 - 以及大的情感讨论.但最后,将"this"更改为引用嵌入类是解决问题的简单方法,更符合来自Java的人员,如果你坚持的话,你可以轻松绕过MOP.
看一下第144页
......这是指关闭,而不是声明对象.在这一点上,闭包对我们来说是个窍门.他们将所有方法调用委托给一个所谓的委托对象,默认情况下,委托对象就是声明对象(即所有者).这使得闭包看起来就像封闭的代码在生日上下文中运行一样.
对于你的问题;
闭包内部的这个值是否为调用闭包的范围?
从书中他们说"这指的是封闭,而不是宣告对象"但是从bertport和我的实验来看,似乎"这"实际上是宣告对象.
无论哪种方式,你的问题的答案仍然是"不".
在上面显示的闭包内,这和调用者指的是相同的范围?
恐怕不是.
请注意,Groovy in Action中的第143和144页需要进行一些更正
http://groovy.canoo.com/errata/erratum/show/5
http://groovy.canoo.com/errata/erratum/show/8
| 归档时间: |
|
| 查看次数: |
10364 次 |
| 最近记录: |