簡體   English   中英

Groovy中的遞歸與關閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM