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?
}
}
これはうまくいくはずだと感じています:
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)
}
}
これらのit
変数はではなくイテレータであり、 クロージャ パラメータです。名前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)
}
}
クロージャはコードのデバッグを非常に難しくし、潜在的に遅くなるため、これはより良い方法です。そしてこの場合、とにかくクロージャを使用することに実際には何の利点もありません。
it.projectList.each {...}
?
そしてこれ: http://groovy.codehaus.org/Looping 。
リスト内のものではなく、リスト上でループします。あなたのコードから、あなたはリストの中のものをループしているようです。