Элегантный способ для... пока в groovy
Как сделать код что-то вроде этого в groovy
?
do {
x.doIt()
} while (!x.isFinished())
Потому что нет do... while
синтаксис в Groovy.
Синтаксиса do... while() пока нет.
Из-за двусмысленности мы еще не добавили поддержку do.. while to Groovy
Рекомендации:
Ответы
Ответ 1
Так много ответов и ни одного без лишнего звонка, позор;)
Это самое близкое к чисто языковому синтаксису занятие в Groovy:
while ({
x.doIt()
!x.isFinished()
}()) continue
Последний оператор в фигурных скобках (в замыкании) оценивается как условие выхода из цикла.
Вместо ключевого слова continue
можно использовать точку с запятой.
Еще одна приятная вещь, цикл может быть параметризован (вроде), например:
Closure<Boolean> somethingToDo = { foo ->
foo.doIt()
!foo.isFinished()
}
а затем в другом месте:
while (somethingToDo(x)) continue
Ранее я предлагал этот ответ здесь: Как перебрать все байты во входном потоке с помощью Groovy, учитывая, что в нем отсутствует оператор do-while?
Ответ 2
Вы можете перевернуть свой собственный цикл, который почти что вы хотите.
Здесь пример с loop { code } until { condition }
Вы не можете иметь соответствующий loop { code } while { condition }
, потому что while является ключевым словом.
Но вы могли бы назвать это чем-то еще.
В любом случае, здесь есть приблизительный и готовый код для цикла.
Один из них - это то, что вам нужно использовать фигурные скобки для условия до закрытия, чтобы сделать его закрытием.
Там могут быть другие проблемы.
class Looper {
private Closure code
static Looper loop( Closure code ) {
new Looper(code:code)
}
void until( Closure test ) {
code()
while (!test()) {
code()
}
}
}
Использование:
import static Looper.*
int i = 0
loop {
println("Looping : " + i)
i += 1
} until { i == 5 }
Ответ 3
В зависимости от вашего варианта использования существуют следующие варианты: do.. while() в Groovy с помощью inputStream?
Или вы можете сделать:
x.doIt()
while( !x.finished ) { x.doIt() }
или
while( true ) {
x.doIt()
if( x.finished ) break
}
Ответ 4
Обновление Groovy 2.6 было прекращено, чтобы сконцентрироваться на 3.0.
Начиная с версии Groovy 2.6, при включении нового Parrot Parser поддерживается do-while, а с Groovy 3.0 - по умолчанию. Смотрите примечания к выпуску:
// classic Java-style do..while loop
def count = 5
def fact = 1
do {
fact *= count--
} while(count > 1)
assert fact == 120
Ответ 5
Вы можете использовать переменную условия с регулярным циклом while:
def keepGoing = true
while( keepGoing ){
doSomething()
keepGoing = ... // evaluate the loop condition here
}
Ответ 6
Или вы можете реализовать его способом Groovier:
def loop(Closure g){
def valueHolder = [:]
g.delegate = valueHolder
g.resolveStrategy = Closure.DELEGATE_FIRST
g()
[until:{Closure w ->
w.delegate = valueHolder
w.resolveStrategy = Closure.DELEGATE_FIRST
while(!w()){
g()
}
}]
}