[英]Recursion in Groovy with closure
我目前正在嘗試了解遞歸問題。 此代碼檢查節點是否為葉節點,如果是,它將增加葉節點的數量。
我不明白fn.call(this)的作用,然后又如何在for循環中調用閉包。
這是我的代碼。
class TreeNode {
String name
List<TreeNode> children = []
// if no children, there is no leaf node
boolean isLeaf() {
return !children
}
void walkTree(Closure fn) {
fn.call(this)
for (child in children) {
child.walkTree(fn)
}
}
}
testTreeNode = new TreeNode(name: "Fred", children: [
new TreeNode(name: "Janet", children: [
new TreeNode(name: "Mark"),
new TreeNode(name: "Anne", children: [new TreeNode(name: "Simon") ]),
new TreeNode(name: "Kelly")
]),
new TreeNode(name: "Nigel")
])
def leafCount = 0
testTreeNode.walkTree { node -> if (node.leaf) leafCount++}
希望我能正確追蹤,但看來您有2個問題:
1. fn.call(this)
什么作用?
首先,閉包是可以在以后執行的匿名代碼塊。
當您調用testTreeNode.walkTree
,您將傳遞Closure(匿名代碼塊) node -> if (node.leaf) leafCount++
作為walkTree
方法的參數,因此,閉包成為walkTree
上下文中名為fn
的變量。
然后在walkTree
方法中,使用Closure.call(args)方法顯式調用Closure(代碼塊)。
請參閱: http : //groovy-lang.org/closures.html#_calling_a_closure
2.在for循環中如何執行閉包?
由於可以使用fn
變量名來引用閉包,因此您可以將其作為參數直接傳遞給walkTree
中每個子TreeNode的walkTree
,然后使用fn.call(this)
調用該閉包。
如果我們用傳遞的代碼塊代替Closure用法,那么可能會更清楚發生了什么:
void walkTree(Closure fn) {
//Closure executed here
if (this.leaf) leafCount++
for (child in children) {
//closure passed as argument to walkTree method of child TreeNodes
child.walkTree { node -> if (node.leaf) leafCount++ }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.