Подтвердить что ты не робот

Как вы вставляете итераторы в groovy?

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

Ответ 1

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

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

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

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

Ответ 3

 it.projectList.each {...}

?

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

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