KotlinLambda函数中的返回值和限定标签

bvn4nwqk  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(117)

我正在努力理解Kotlin中的一个概念。查看this

val lambda = { greeting: String, name: String -> 
    if(greeting.length < 3) return // error: return not allowed here
    
    println("$greeting $name")
}

这将导致错误。请将lambda表达式重写为此

val lambda = greet@ { greeting: String, name: String -> 
    if(greeting.length < 3) return@greet
    
    println("$greeting $name")
}

这是可行的,因为“......从lambda返回到外部调用函数......
我很难理解的是,* 外部调用函数 * 是什么。没有其他函数调用lambda。这里到底发生了什么?

kr98yfug

kr98yfug1#

你是对的,现在没有其他函数调用lambda *。这意味着,当你决定调用lambda时,它将返回到你正在调用的函数。
例如,如果您有:

fun someFunction() {
    lambda()
    // some other code...
}

然后return@greet将返回到someFunctionsomeFunction是“外部调用函数”。
只是说这可能没有什么意义,除非你把它和没有标签的return进行比较。让我们假设一个returnreturn@label都允许的情况:

fun main() {
    aMoreMeaningfulExample foo@{
        if (it == 3) return@foo
        println(it)
    }
}

inline fun aMoreMeaningfulExample(lambda: (Int) -> Unit) {
    for (x in 1..5) {
        lambda(x)
    }
    println("Done!")
}

这里,return@foo返回到lambda的“外部调用函数”,即aMoreMeaningfulExample。这意味着当it为3时,println(it)将被跳过。返回到aMoreMeaningfulExample后,for循环仍将正常继续,因此您将看到剩余的数字,并打印“Done!”。
另一方面,如果你使用return,它会返回到任何称为main的地方,换句话说,终止程序。你只会看到“1”和“2”被打印出来。

相关问题