为什么不能在 let 或 run 中使用 continue

dir*_*lik 9 kotlin

为什么不允许continuefromlet函数?

此代码

fun foo(elements: List<String?>) {
    for (element in elements) {
        element?.let {
            continue  // error: 'break' or 'continue' jumps across a function or a class boundary
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至这个代码

fun foo(elements: List<String?>) {
    loop@ for (element in elements) {
        element?.let {
            continue@loop  // error: 'break' or 'continue' jumps across a function or a class boundary
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不编译错误:

'break' 或 'continue' 跳过函数或类边界


我知道在这种特殊情况下我可以使用filterNotNullsmart cast 或手动检查,但我的问题是为什么不允许在continue这里使用?


请在此处投票支持此功能https : //youtrack.jetbrains.com/issue/KT-1436

Ten*_*r04 7

这些将被称为“非本地”中断和继续。根据文档

break并且continue在内联 lambda 中尚不可用,但我们也计划支持它们。

return仅当它是内联 lambda 时才支持在 lambda 中使用裸(例如非本地)(因为否则它不知道调用它的上下文)。所以break并且continue应该能够得到支持。我不知道功能延迟的原因。

请注意,run无论是在循环内还是循环外,都有针对它们的解决方法,并利用内联函数至少支持非本地返回这一事实。

fun foo(elements: List<String?>) {
    run {
        for (element in elements) {
            element?.let {
                println("Non-null value found in list.")
                return@run // breaks the loop
            }
        }
    }
    println("Finished checking list")
}

fun bar(elements: List<String?>) {
    for (element in elements) {
        run {
            element?.let {
                return@run // continues the loop
            }
            println("Element is a null value.")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)