我是Groovy的新手,我正在研究官方文档中的闭包。 The 'delegate of a closure' topic给出了以下示例:
所以,在数字5中,我知道委托被设置为默认为所有者,在这种情况下是封闭的封闭enclosed
。
那么,为什么要打电话
{ -> delegate }.call()
enclosed
闭包内的是否在递归调用中结束?看起来像是一个递归给我,但如果你运行代码,不是一个递归。我在这里失踪了什么?
答案 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
,第二个调用它。