为什么不允许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
这些将被称为“非本地”中断和继续。根据文档:
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)