Façon élégante pour faire ... tout en groovy

comment coder quelque chose comme ça dans groovy ?

do {

  x.doIt()

} while (!x.isFinished())

parce qu'il y a no do ... while syntaxe dans groovy.

Non " ne ... while()' la syntaxe encore.

en raison de l'ambiguïté, nous n'avons pas encore ajouté de support pour do .. tandis que Groovy

, les Références:

  • groovy-dev > do while
  • la Migration Du Classique à la JSR syntaxe
  • Groovy Documentation > Structures De Contrôle > "1519350920 Le" Bouclage
  • code Rosetta > Loops / Do-while Groovy
38
demandé sur MariuszS 2014-01-04 17:20:14

6 réponses

tant de réponses et pas une seule sans un appel redondant (un avant la boucle et le reste à l'intérieur), honte.

C'est ce qui se rapproche le plus d'une syntaxe purement langagière do-while in Groovy:

while ({
    x.doIt()
    !x.isFinished()
}()) continue

le dernier énoncé à l'intérieur des entretoises bouclées (à l'intérieur de la fermeture) est évalué comme une condition de sortie de boucle.

au Lieu de continue mot-clé un point-virgule peut être utilisé.

chose agréable supplémentaire à ce sujet, boucle peut être paramétrée (genre de), comme:

Closure<Boolean> somethingToDo = { foo ->
    foo.doIt()
    !foo.isFinished()
}

et puis ailleurs:

while (somethingToDo(x)) continue

auparavant, j'ai proposé cette réponse ici: do .. while() en Groovy, avec inputStream?

6
répondu topr 2017-09-28 16:35:31

vous pouvez lancer votre propre boucle qui est presque ce que vous voulez. Voici un exemple avec loop { code } until { condition } Vous ne pouvez pas avoir un loop { code } while { condition } correspondant parce que tandis est un mot clé. Mais vous pourriez l'appeler quelque chose d'autre.

bref, voici un code approximatif et prêt pour loop until. Un gotcha est vous devez utiliser des bretelles pour la condition jusqu'à ce que pour en faire une fermeture. Il peut bien y avoir d'autres problèmes avec elle.

class Looper {
   private Closure code

   static Looper loop( Closure code ) {
      new Looper(code:code)
   }

   void until( Closure test ) {
      code()
      while (!test()) {
         code()
      }
   }
}

Utilisation:

import static Looper.*

int i = 0
loop {
   println("Looping : "  + i)
   i += 1
} until { i == 5 }
55
répondu Steve Sowerby 2014-01-05 16:33:33

selon votre cas d'utilisation, il y a des options comme celle-ci: do .. while() en Groovy, avec inputStream?

ou vous pouvez faire:

x.doIt()
while( !x.finished ) { x.doIt() }

ou

while( true ) {
    x.doIt()
    if( x.finished ) break
}
20
répondu tim_yates 2017-05-23 12:34:08

De Groovy 2.6 sur, tout est pris en charge lors de l'activation de la nouvelle Parrot Analyseur de Groovy 3.0 sur c'est la valeur par défaut. Voir notes de mise à jour :

// classic Java-style do..while loop
def count = 5
def fact = 1
do {
    fact *= count--
} while(count > 1)
assert fact == 120
5
répondu Mene 2018-04-18 09:34:25

vous pouvez utiliser une variable de condition avec la boucle regular while:

def keepGoing = true
while( keepGoing ){
    doSomething()
    keepGoing = ... // evaluate the loop condition here
}
3
répondu GreenGiant 2017-04-06 19:43:30

ou vous pouvez le mettre en œuvre D'une manière 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()
        }
        }]
}
1
répondu Cao Cao 2016-05-14 06:45:26