1

在我们当前的应用程序中,我们需要遍历树并捕获特定设备(和子设备)上的所有运算符。一个设备可以有子设备,上面也有特定的操作符。

由于我是在 Groovy 中使用递归的新手,我想知道我做的事情是否正确..?有什么指针可以帮助我学习更好的做事方式吗?

def listOperators(device) {
    // list with all operator id's
    def results = []

    // closure to traverse down the tree
    def getAllOperators = { aDevice->
        if(aDevice) {
            aDevice.operators.each { it ->
                results << it.id
            }
        }
        if (aDevice?.children) {
            aDevice.children.each { child ->
                results << owner.call(child)
            }
        }
    }

    // call the closure with the given device
    getAllOperators(device)

    // return list with unique results
    return results.unique()
}
4

1 回答 1

4

有几点需要注意:

  • 通过递归调用owner不是一个好主意。owner如果调用嵌套在另一个闭包中,则更改的定义。它容易出错,并且与仅使用名称相比没有任何优势。当闭包是一个局部变量时,将它的声明和闭包的定义分开,这样名称就在范围内。例如:

    def getAllOperators
    getAllOperators = { ...

  • 您将运算符附加到递归闭包之外的结果列表。但是您还将每个递归调用的结果附加到同一个列表中。附加到列表存储每个递归调用的结果,但不能同时存储两者。

这是一个更简单的替代方案:

def listOperators(device) {
    def results = []
    if (device) {
        results += device.operators*.id
        device.children?.each { child ->
            results += listOperators(child)
        }
    }
    results.unique()
}
于 2012-10-29T22:42:43.323 回答