Как вы делаете вложенные итераторы в groovy?

17

Поддерживает ли 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?
    }
}
    
задан Derek 24.09.2010 в 19:18
источник

3 ответа

17

Кажется, что это должно работать:

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)
    }
}
    
ответ дан mfloryan 25.09.2010 в 00:09
источник
25

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

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

    
ответ дан Michael Borgwardt 24.09.2010 в 19:31
источник
0
 it.projectList.each {...}

?

и это: Ссылка .

Вы зацикливаете на списке, а не на вещи в списке. Кажется, из вашего кода вы зацикливаете на предмет в списке.

    
ответ дан hvgotcodes 24.09.2010 в 19:22
источник