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

Элегантный способ для... пока в groovy

Как сделать код что-то вроде этого в groovy?

do {

  x.doIt()

} while (!x.isFinished())

Потому что нет do... while синтаксис в Groovy.

Синтаксиса do... while() пока нет.

Из-за двусмысленности мы еще не добавили поддержку do.. while to Groovy

Рекомендации:

4b9b3361

Ответ 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()
        }
        }]
}