[解決済み] Kotlin の `forEach` における `break` と `continue` について
2022-04-13 16:13:59
質問
Kotlin には、次のような非常に優れた反復処理関数があります。
forEach
または
repeat
を作成することができません。
break
と
continue
演算子が動作します (ローカルおよび非ローカルの両方)。
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
目標は、通常のループを関数的な構文で可能な限り模倣することです。Kotlinの古いバージョンでは間違いなく可能でしたが、その構文を再現するのに苦労しています。
問題はラベルのバグかもしれませんが(M12)、とにかく最初の例はうまくいくはずだと思います。
特殊な仕掛け・注釈があることをどこかで読んだような気がするのですが、この件に関する参考文献が見つかりませんでした。以下のような感じかもしれません。
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
解決方法は?
編集
:
Kotlinの
ドキュメント
をシミュレートすることができます。
continue
アノテーションを使用しています。
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@ {
if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
print(it)
}
print(" done with explicit label")
}
をシミュレートしたい場合は
break
を追加するだけです。
run
ブロック
fun foo() {
run lit@ {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
print(it)
}
print(" done with explicit label")
}
}
オリジナル回答
:
を指定しているので
(Int) -> Unit
というのも、コンパイラはそれがループの中で使われていることを知らないからです。
選択肢は少ない。
通常のforループを使用する。
for (index in 0 until times) {
// your code here
}
ループがメソッド内の最後のコードである場合
を使用することができます。
return
を使ってメソッドから抜け出すことができます(または
return value
でない場合は
unit
メソッド) を使用します。
メソッドを使用する
を返すカスタムリピートメソッドメソッドを作成します。
Boolean
を継続させる。
public inline fun repeatUntil(times: Int, body: (Int) -> Boolean) {
for (index in 0 until times) {
if (!body(index)) break
}
}
関連
-
[解決済み】Angular 2 formArraysでname属性が指定されていないコントロールが見つからない。
-
[解決済み] Array.forEachでbreakを呼び出すようなショートサーキット
-
[解決済み] Javaでネストされたループから抜け出すには?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] C#のループ - breakとcontinue
-
[解決済み] foreach インデックスを見つけるには?
-
[解決済み] foreachループの最初と最後の繰り返しを決定する方法は?
-
[解決済み] Java 8 のストリーム forEach からブレークまたはリターンしますか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Angular 2 formArraysでname属性が指定されていないコントロールが見つからない。
-
[解決済み] フローチャートでネストしたforループを表示する
-
[解決済み] MIPSで階乗を行うコードはどのように書くのですか?
-
[解決済み] GAMSでマクロ/ループを作成する
-
[解決済み] AutoHotKeyのホットキーでSetTimerをオフに切り替えるには?
-
[解決済み] Rustで範囲指定はどうやるの?
-
[解決済み] Angular 2 formArraysに指定されていないname属性を持つコントロールが見つからない
-
[解決済み] マップの全キーに対する反復処理
-
[解決済み】整数の範囲内で反復処理する方法はありますか?
-
[解決済み] Kotlin の `forEach` における `break` と `continue` について