Kotlin の `forEach` における `break` と `continue` 質問する

Kotlin の `forEach` における `break` と `continue` 質問する

forEachKotlin には、 or のような非常に優れた反復関数がありますが、 and演算子をそれらで動作さrepeatせることはできません(ローカルと非ローカルの両方)。breakcontinue

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)
    }
}

ベストアンサー1

これにより、1 から 5 が出力されます。これはJava のreturn@forEachキーワードのように動作しますcontinue。つまり、この場合、すべてのループが実行されますが、値が 5 より大きい場合は次の反復にスキップされます。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    nums.forEach {
       if (it > 5) return@forEach
       println(it)
    }
}

これにより、1 から 10 が印刷されますが、5 はスキップされます。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    nums.forEach {
       if (it == 5) return@forEach
       println(it)
    }
}

これは 1 から 4 を出力し、5 に達すると中断します。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    run breaking@ {
        nums.forEach {
           if (it == 5) return@breaking
           println(it)
        }
    }
}

ashuges からのコード スニペットへのリンク

おすすめ記事