[英]Kotlin: Multiple returns inside a Lambda
我有一个函数可以捕获可恢复的异常并返回一个回退
private fun <T> safely(block: () -> T, fallback: T): T {
return try {
block()
} catch(exc: SomeException) {
// Log the exception/do some logic
fallback
}
}
我希望能够将其添加到我的类的公共方法中,例如
fun doSomething(): List<String> = safely({
val list = mutableListOf<String>("Hello")
fun someCheck1() = false // Some boolean value
fun someCheck2() = true // Some boolean value
do {
if(someCheck2()) {
return arrayListOf<String>("Hello", "World")
}
} while (someCheck1())
return list
}, arrayListOf<String>())
但是我得到编译器错误'return' is not allowed here
然而,如果我删除return
那么我在循环中的返回将不再有效,并且它会在我的 IDE 中突出显示并警告the expression is never used
如何在 Lambda 中维护这种类型的返回逻辑?
尝试
fun doSomething(): List<String> = safely(
{
val list = mutableListOf<String>("Hello")
fun someCheck1() = false // Some boolean value
fun someCheck2() = true // Some boolean value
do {
if (someCheck2()) {
return@safely arrayListOf<String>("Hello", "World")
}
} while (someCheck1())
list
}
, arrayListOf<String>())
如需进一步参考,请检查在 lambda 内使用返回?
或者您也可以将您的块提取到一个单独的函数中(即someCheckFunction(): List<String>
),并fun doSomething() = safely({ someCheckFunction() }, arrayListOf())
,但我想你想保持像上面这样的 lambda 代码。
return arrayListOf<String>("Hello", "World")
在这里尝试从doSomething
函数而不是从传递给safely
的 lambda 返回一个值。 然而,这种返回是非局部的,因为它试图退出不在栈顶的函数,因此被禁止。
这里的另一个选择是使safely
功能inline :
inline fun <T> safely(block: () -> T, fallback: T): T { ... }
然后您将能够从传递给它的block
lambda 函数中进行非本地返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.