Как вы делаете вложенные итераторы в Groovy? - PullRequest
20 голосов
/ 24 сентября 2010

Поддерживает ли 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?
    }
}

Ответы [ 3 ]

29 голосов
/ 24 сентября 2010

Эти it переменные являются , а не итераторами, они являются замыканием параметрами. Имя 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)
    }
}

Это лучше, потому что замыкания делают код более трудным для отладки, а также потенциально медленнее. И в этом случае в любом случае нет никакого преимущества в использовании замыканий.

20 голосов
/ 25 сентября 2010

Такое ощущение, что это должно работать:

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)
    }
}
0 голосов
/ 24 сентября 2010
 it.projectList.each {...}

?

и это: http://groovy.codehaus.org/Looping.

Вы зацикливаетесь на списке, а не на элементе в списке.Судя по вашему коду, вы зацикливаетесь на элементе в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...