groovy
でこのようなコードを作成する方法は?
do {
x.doIt()
} while (!x.isFinished())
Groovyには_do ... while
構文がないためです。
'do ... while()'構文はまだありません
あいまいさのため、Groovyにdo .. whileのサポートをまだ追加していません
参照:
非常に多くの回答があり、冗長な呼び出し(ループの前と残り)がない単一の回答ではありません。
これは、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?
ほぼ必要なループを独自に作成できます。以下は_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 }
_
ユースケースに応じて、次のようなオプションがあります。 do .. while()Groovy in inputStream?
または、次のことができます。
x.doIt()
while( !x.finished ) { x.doIt() }
または
while( true ) {
x.doIt()
if( x.finished ) break
}
通常のwhileループで条件変数を使用できます。
def keepGoing = true
while( keepGoing ){
doSomething()
keepGoing = ... // evaluate the loop condition here
}
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
または、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()
}
}]
}