为什么这个闭包调用不会在递归调用中结束?

时间:2016-04-30 02:53:28

标签: recursion groovy closures

我是Groovy的新手,我正在研究官方文档中的闭包。 The 'delegate of a closure' topic给出了以下示例:

enter image description here

所以,在数字5中,我知道委托被设置为默认为所有者,在这种情况下是封闭的封闭enclosed

那么,为什么要打电话

{ -> delegate }.call()
enclosed闭包内的

是否在递归调用中结束?看起来像是一个递归给我,但如果你运行代码,不是一个递归。我在这里失踪了什么?

2 个答案:

答案 0 :(得分:2)

def enclosed = {
    // delegate == owner == enclosed (variable)
    { ->
        // When this closure is called return the delegate (enclosed) 
        delegate 
    }.call() // Called immediately                          

    // above closure is same as writing
    // return delegate
}

// When enclosed in called the delegate is returned immediately
// from the invocation of the inner closure, hence the result of the 
// closure call is the closure (delegate) itself
assert enclosed() == enclosed

请记住,在调用enclosed之前,在enclosed()闭包内发生的任何事情都不会发生。 :)它现在描绘了一幅清晰的画面吗?

答案 1 :(得分:2)

{ -> delegate }.call()闭包中调用enclosed并不会导致递归调用,因为在另一个闭包上调用了call();在enclosed中创建的那个。要获得递归调用,您可以执行以下操作:{ -> delegate }.call().call()。第一个call()返回enclosed,第二个调用它。