web-dev-qa-db-ja.com

優雅な方法...グルーヴィーなとき

groovyでこのようなコードを作成する方法は?

do {

  x.doIt()

} while (!x.isFinished())

Groovyには_do ... while構文がないためです。

'do ... while()'構文はまだありません

あいまいさのため、Groovyにdo .. whileのサポートをまだ追加していません

参照:

49
MariuszS

非常に多くの回答があり、冗長な呼び出し(ループの前と残り)がない単一の回答ではありません。

これは、Groovyで純粋に言語構文に基づいたdo-whileに最も近いものです。

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

中かっこ内の最後のステートメント(クロージャ内)は、ループ終了条件として評価されます。

continueキーワードの代わりに、セミコロンを使用できます。

それに関する追加の素晴らしいこと、ループは次のようにパラメータ化することができます(のような):

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

そして他の場所:

while (somethingToDo(x)) continue

以前、私はここでこの答えを提案しました: do .. while()with Groovy with inputStream?

13
topr

ほぼ必要なループを独自に作成できます。以下は_loop { code } until { condition }_の例です。whileはキーワードであるため、対応する_loop { code } while { condition }_を使用することはできません。しかし、あなたはそれを別のものと呼ぶことができます。

とにかく、ここにループまでの大まかな準備ができたコードがあります。一つの落とし穴は、それをクロージャーにするために、until条件にブレースを使用する必要があるということです。他にも問題がある可能性があります。

_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 }
_
58
Steve Sowerby

ユースケースに応じて、次のようなオプションがあります。 do .. while()Groovy in inputStream?

または、次のことができます。

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

または

while( true ) {
    x.doIt()
    if( x.finished ) break
}
20
tim_yates

通常のwhileループで条件変数を使用できます。

def keepGoing = true
while( keepGoing ){
    doSomething()
    keepGoing = ... // evaluate the loop condition here
}
5
GreenGiant

UpdateGroovy 2.6は3.0に集中するために放棄されました。

Groovy 2.6以降では、新しいParrot Parserを有効にするときにdo-whileがサポートされます。Groovy3.0ではこれがデフォルトです。 リリースノート を参照してください:

// classic Java-style do..while loop
def count = 5
def fact = 1
do {
    fact *= count--
} while(count > 1)
assert fact == 120
5
Mene

または、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
Cao Cao