为什么关闭不起作用?

时间:2013-10-23 22:31:01

标签: groovy

我有以下关闭:

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)
}

1 个答案:

答案 0 :(得分:1)

我不确定您正在进行递归的场景的有效性,但是当您使用closure进行递归时,必须在定制变量之前预先定义变量,以便它可以在递归。例如:

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

我无法从递归中找出退出策略,但如果您可以详细说明上下文并添加一个破坏样本来运行,我可以添加更多内容。