groovy是否支持任何类型的嵌套迭代器表示法?
在下面的例子中,我想以某种方式将来自外部迭代器的projectName值传入我的内部迭代器。这可能不存储在变量中吗?在我的例子中,我得到一个runtuime错误,找不到“项目”
it.myprojects.project.each{
println("Project name: " + it.projectName)
it.myroles.role.each{
Role role = new Role()
role.setName(project.projectName)//how do I get projectName here without storting it in a variable in the outer loop?
}
}
答案 0 :(得分:29)
那些it
变量是不是迭代器,它们是closure参数。名称it
不是“iterator”的缩写,它的字面意思是“it”,用作单参数闭包的默认名称。但是,您可以使用显式(因此不同的嵌套)名称,如下所示:
it.myprojects.project.each{ project ->
println("Project name: " + project.projectName)
project.myroles.role.each{ role->
Role r= new Role()
r.setName(project.projectName)
}
}
实际上,我建议不要使用each
方法,而是使用实际循环:
for(project in it.myprojects.project){
println("Project name: " + project.projectName)
for(role in project.myroles.role){
Role r= new Role()
r.setName(project.projectName)
}
}
这是更好的,因为闭包使代码更难调试,也可能更慢。在这种情况下,无论如何使用闭包并没有任何优势。
答案 1 :(得分:20)
感觉这应该有效:
it.myprojects.project.each{ project->
println("Project name: " + project.projectName)
it.myroles.role.each{
Role role = new Role()
role.setName(project.projectName)
}
}
此外,您可以使用owner
变量
it.myprojects.project.each{
println("Project name: " + it.projectName)
it.myroles.role.each{
Role role = new Role()
role.setName(owner.projectName)
}
}
但是,如果你所做的只是创建Role类的新实例,我没有看到迭代角色的原因。也许这样的事情会更简单:
it.myprojects.project.each{
println("Project name: " + it.projectName)
it.myroles.role.size().times {
Role role = new Role()
role.setName(owner.projectName)
}
}
答案 2 :(得分:0)
it.projectList.each {...}
和此:http://groovy.codehaus.org/Looping。
你循环列表,而不是列表中的东西。从您的代码中看,您正在循环查看列表中的内容。