繁体   English   中英

Kotlin:Lambda 中的多次返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM