loops - Manera elegante para hacer... mientras en groovy
do-while (6)
Dependiendo de su caso de uso, hay opciones como esta: do .. while () en Groovy con inputStream?
O puedes hacer:
x.doIt()
while( !x.finished ) { x.doIt() }
O
while( true ) {
x.doIt()
if( x.finished ) break
}
¿Cómo codificar algo así en groovy
?
do {
x.doIt()
} while (!x.isFinished())
Porque no hay do ... while
sintaxis está en groovy.
No ''do ... while (sintaxis) todavía.
Debido a la ambigüedad, todavía no hemos agregado soporte para hacer ... mientras que para Groovy
Referencias
Desde Groovy 2.6 on, do-while es compatible cuando se habilita el nuevo Parrot Parser, desde Groovy 3.0 en este es el predeterminado. Ver notas de la versión :
// classic Java-style do..while loop
def count = 5
def fact = 1
do {
fact *= count--
} while(count > 1)
assert fact == 120
O puede implementarlo de una manera 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()
}
}]
}
Puede hacer su propio bucle que es casi lo que quiere. Aquí hay un ejemplo con loop { code } until { condition }
No puede tener un loop { code } while { condition }
porque while es una palabra clave. Pero podrías llamarlo de otra manera.
De todos modos, aquí hay un código difícil y listo para el ciclo hasta. Uno tiene que usar llaves para la condición hasta que sea un cierre. Puede haber otros problemas con eso.
class Looper {
private Closure code
static Looper loop( Closure code ) {
new Looper(code:code)
}
void until( Closure test ) {
code()
while (!test()) {
code()
}
}
}
Uso:
import static Looper.*
int i = 0
loop {
println("Looping : " + i)
i += 1
} until { i == 5 }
Puede usar una variable de condición con el ciclo while normal:
def keepGoing = true
while( keepGoing ){
doSomething()
keepGoing = ... // evaluate the loop condition here
}
Tantas respuestas y ni una sola sin una llamada redundante (una antes del ciclo y el resto en el interior), vergüenza.
Esto es lo más cercano que puede llegar a la sintaxis puramente basada en el lenguaje do-while en Groovy:
while ({
x.doIt()
!x.isFinished()
}()) continue
La última instrucción dentro de llaves (dentro del cierre) se evalúa como una condición de salida de bucle.
En lugar de continue
se puede usar un punto y coma.
Otra cosa agradable es que el lazo se puede parametrizar (tipo de), como:
Closure<Boolean> somethingToDo = { foo ->
foo.doIt()
!foo.isFinished()
}
y luego en otro lado
while (somethingToDo(x)) continue
Anteriormente, he propuesto esta respuesta aquí: do .. while () en Groovy con inputStream?