0

私は次の閉鎖を持っています:

def deepSave = {
    it.attributes.each{it.save(validate: false)}
    it.elements.each{deepSave(it)}
    it.save(validate: false)
}

私は次のように呼んでいます:

deepSave(someObject.rootElement)

これは失敗し、スタック トレースが長すぎて PowerShell のバッファがいっぱいになるため、原因がわかりません。

クロージャーでやろうとしているのと同じことを行うために、以下のメソッドを作成しましたが、正常に動作します。閉鎖が機能しないのはなぜですか?

private def deepSave(def someElement) {
    for(attribute in someElement.attributes) {
        attribute.save(validate: false)
    }
    for(element in someElement.elements) {
        deepSave(element)
    }
    someElement.save(validate: false)
}
4

1 に答える 1

2

再帰を実行しているシナリオの有効性についてはclosureわかりませんが、再帰に使用する場合、再帰中に変数自体を認識できるように調整する前に、変数を事前に定義する必要があります。例えば:

def deepSave
deepSave = {
    it.attributes.each{it.save(validate: false)}
    it.elements.each{deepSave(it)}
    it.save(validate: false)
}

再帰からの出口戦略を理解することはできませんでしたが、コンテキストを詳しく説明し、実行するブレーク サンプルを追加できる場合は、さらに追加することができます。

于 2013-10-24T02:14:53.580 に答える