Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy:x27的含义;这';封闭内部_Groovy_Closures - Fatal编程技术网

Groovy:x27的含义;这';封闭内部

Groovy:x27的含义;这';封闭内部,groovy,closures,Groovy,Closures,下面的示例改编自“Groovy正在运行” class Mother { Closure birth() { def closure = { caller -> [this, caller] } return closure } } Mother julia = new Mother() closure =

下面的示例改编自“Groovy正在运行”

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`显示了如何获取要在块内使用的引用。但如果不使用外部上下文,就不可能获得闭包的引用,这是正确的。