groovy中的递归(grails)
我试图在groovy中使用递归遍历树关系。下面的代码运行一个循环,直到childNodes&&recurClosure(childNodes),但不会再次调用闭包recurClosure。此时,childNodes有两个与root相同类型的对象(数组列表) 在代码中,定义了recurClosure,并使用对象列表(根)调用它。然后它遍历每个元素并细化子节点(为此使用grails dsl) 我应该把它拆开,还是怎么了groovy中的递归(grails),grails,groovy,Grails,Groovy,我试图在groovy中使用递归遍历树关系。下面的代码运行一个循环,直到childNodes&&recurClosure(childNodes),但不会再次调用闭包recurClosure。此时,childNodes有两个与root相同类型的对象(数组列表) 在代码中,定义了recurClosure,并使用对象列表(根)调用它。然后它遍历每个元素并细化子节点(为此使用grails dsl) 我应该把它拆开,还是怎么了 def parentval def root = Domain.list()
def parentval
def root = Domain.list()
def recurClosure
recurClosure = {inroot ->
inroot.each {
returnList << it
parentval = it
childNodes = Domain.withCriteria {
eq('parent', parentval )
}
}
childNodes && recurClosure(childNodes )
}(root)
return returnList
更新2:现在尝试丹尼尔的建议
{ inroot ->
inroot.each {
returnList << it
parentval = it
childNodes = Domain.withCriteria {
eq('parent', parentval )
}
if(childNodes)
call(childNodes)
}
/*if(childNodes)
call(childNodes)*/
}(root)
我看到一篇关于如何通过>我将更新我的发现来命名关闭的博客文章。。谢谢
更新3:调用外部闭包的方法是owner.call(childNodes)是否有任何异常?
您是否尝试过这样单独调用它:
def recurClosure
recurClosure = {inroot ->
[... stuff ...]
}
recurClosure(root)
在这一行中,您到底想做什么:
childNodes && recurClosure(childNodes )
问题是
recurClosure = {
[...]
}(root)
您不会将闭包指定给recurClosure
,而是指定其调用的返回值!因此,当然,您不能通过recurClosure()
调用闭包
两种可能的解决办法:
首先定义闭包,然后单独调用它,正如air_blob所建议的:
def recurClosure = {
[...]
}
recurClosure(root)
使用隐式call()
函数进行递归。这样,您甚至可以使用匿名闭包。IMHO是在Groovy中实现递归的一种非常好的方法:
{ inroot ->
inroot.each {
returnList << it
parentval = it
childNodes = Domain.withCriteria {
eq('parent', parentval )
}
}
if(childNodes)
call(childNodes)
}(root)
{inroot->
每根{
returnList感谢您的建议。我更新了一个例外。childNodes&&recurClosure(childNodes)的目的是继续递归,直到childnode为null。可能数组列表不会为null,所以我尝试了(childNodes.size()>0)和&recurClosure(childNodes)但是同样的结果。从异常情况来看,它似乎无法访问闭包。Daniel..很高兴看到你的答案,因为它捕捉到了代码中的所有错误..好吧,我修改了我的代码清单,使问题变得更简单。因此,1.我将returnList定义为数组列表。2.我同意3.你是对的,这就是我想要的(我尝试将语句移入和移出该闭包以查看效果)。我当然不是在域类上执行list(),实际上是从另一个表中获取它。我从未打算误导像您这样的专家(groovy和grails:-|)…我正在尝试您的匿名闭包实现..稍后将更新..谢谢,Daniel,我已经用一些详细信息更新了问题..现在的问题是,如何通过“调用”调用外部匿名闭包。再次感谢。谢谢..找到调用外部闭包的解决方案。我需要调用owner.call(childNodes)再次感谢您的详细回答。
def recurClosure = {
[...]
}
recurClosure(root)
{ inroot ->
inroot.each {
returnList << it
parentval = it
childNodes = Domain.withCriteria {
eq('parent', parentval )
}
}
if(childNodes)
call(childNodes)
}(root)