Comment faire quelque chose comme ceci dans groovy
?
do {
x.doIt()
} while (!x.isFinished())
Parce qu'il y a no do ... while
syntaxe en groovy.
Pas encore de syntaxe 'do ... while ()'.
En raison de l'ambiguïté, nous n'avons pas encore ajouté de support pour do .. tant que Groovy
Les références:
Tant de réponses et pas une seule sans un appel redondant (une avant la boucle et le reste en dedans), dommage.
C'est le plus proche possible de la syntaxe purement linguistique do-while dans Groovy:
while ({
x.doIt()
!x.isFinished()
}()) continue
La dernière instruction entre accolades (dans la fermeture) est évaluée en tant que condition de sortie de la boucle.
Au lieu de continue
mot-clé, un point-virgule peut être utilisé.
Une autre chose intéressante à ce sujet, la boucle peut être paramétrée (genre de), comme:
Closure<Boolean> somethingToDo = { foo ->
foo.doIt()
!foo.isFinished()
}
et ensuite ailleurs:
while (somethingToDo(x)) continue
Autrefois, je proposais cette réponse ici: do .. while () dans Groovy avec inputStream?
Vous pouvez faire votre propre boucle qui est presque ce que vous voulez. Voici un exemple avec loop { code } until { condition }
Vous ne pouvez pas avoir un correspondant loop { code } while { condition }
parce que while est un mot clé. Mais vous pouvez l'appeler autrement.
Quoi qu'il en soit, voici un code approximatif pour la boucle. Un des pièges est que vous devez utiliser des accolades pour la condition jusqu'à pour en faire une fermeture. Il pourrait bien y avoir d’autres problèmes.
class Looper {
private Closure code
static Looper loop( Closure code ) {
new Looper(code:code)
}
void until( Closure test ) {
code()
while (!test()) {
code()
}
}
}
Usage:
import static Looper.*
int i = 0
loop {
println("Looping : " + i)
i += 1
} until { i == 5 }
Selon votre cas d'utilisation, il existe des options telles que: do .. while () dans Groovy avec inputStream?
Ou tu peux faire:
x.doIt()
while( !x.finished ) { x.doIt() }
Ou
while( true ) {
x.doIt()
if( x.finished ) break
}
Vous pouvez utiliser une variable de condition avec la boucle while régulière:
def keepGoing = true
while( keepGoing ){
doSomething()
keepGoing = ... // evaluate the loop condition here
}
Mise à jour Groovy 2.6 a été abandonné pour se concentrer sur la version 3.0.
À partir de Groovy 2.6, do-while est pris en charge lors de l'activation du nouveau Parrot Parser. À partir de Groovy 3.0, cette option est utilisée par défaut. Voir notes de version :
// classic Java-style do..while loop
def count = 5
def fact = 1
do {
fact *= count--
} while(count > 1)
assert fact == 120
Ou vous pouvez l'implémenter d'une manière plus 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()
}
}]
}