groovy中的递归(grails)

groovy中的递归(grails),grails,groovy,Grails,Groovy,我试图在groovy中使用递归遍历树关系。下面的代码运行一个循环,直到childNodes&&recurClosure(childNodes),但不会再次调用闭包recurClosure。此时,childNodes有两个与root相同类型的对象(数组列表) 在代码中,定义了recurClosure,并使用对象列表(根)调用它。然后它遍历每个元素并细化子节点(为此使用grails dsl) 我应该把它拆开,还是怎么了 def parentval def root = Domain.list()

我试图在groovy中使用递归遍历树关系。下面的代码运行一个循环,直到childNodes&&recurClosure(childNodes),但不会再次调用闭包recurClosure。此时,childNodes有两个与root相同类型的对象(数组列表)

在代码中,定义了recurClosure,并使用对象列表(根)调用它。然后它遍历每个元素并细化子节点(为此使用grails dsl)

我应该把它拆开,还是怎么了

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)