Groovy:封闭内部'this'的含义

Dón*_*nal 10 groovy closures

以下示例改编自'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 在闭包内部是否计算了调用闭包的范围?
  • 在上面显示的闭包内,thiscaller参考相同的范围?

谢谢,唐

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.


Sak*_*ake 9

看一下第144页

......这是指关闭,而不是声明对象.在这一点上,闭包对我们来说是个窍门.他们将所有方法调用委托给一个所谓的委托对象,默认情况下,委托对象就是声明对象(即所有者).这使得闭包看起来就像封闭的代码在生日上下文中运行一样.

对于你的问题;

闭包内部的这个值是否为调用闭包的范围?

从书中他们说"这指的是封闭,而不是宣告对象"但是从bertport和我的实验来看,似乎"这"实际上是宣告对象.

无论哪种方式,你的问题的答案仍然是"不".

在上面显示的闭包内,这和调用者指的是相同的范围?

恐怕不是.

请注意,Groovy in Action中的第143和144页需要进行一些更正

http://groovy.canoo.com/errata/erratum/show/5

http://groovy.canoo.com/errata/erratum/show/8


far*_*992 5

{
    def self = ({ owner })()
}
Run Code Online (Sandbox Code Playgroud)

所有者:封闭对象(此对象或周围的Closure).