2013-10-23 126 views
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) 
} 

回答

1

我不知道你在哪裏做遞歸判斷的有效性,但是當你用closure遞歸變量,必須預先定義它是定製之前,這樣在它可以瞭解自己遞歸。例如:

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

我無法弄清楚從遞歸的退出戰略,但我可以多一些添加到它,如果你能闡述一下上下文,並添加破樣品運行。

+0

當不再有任何子元素被調用爲「deepSave」時,遞歸停止 - 基本上,它只是保存東西,直到沒有更多的樹進行遞歸。我想知道這裏唯一的問題是缺少預定義變量。 –