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 に答える