Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin内联函数只有一个return语句_Kotlin_Inline - Fatal编程技术网

Kotlin内联函数只有一个return语句

Kotlin内联函数只有一个return语句,kotlin,inline,Kotlin,Inline,我想在函数外部使用内联函数return(跳过打印“after”)。所以当我使用 inline fun test() { return } fun test1() { println("before") test() println("after") } test1() 输出是 before after before 当我使用 inline fun test(callBack: () -> Unit) {

我想在函数外部使用内联函数return(跳过打印“after”)。所以当我使用

inline fun test() {
    return
}

fun test1() {
    println("before")
    test()
    println("after")
}
test1()
输出是

before  
after
before
当我使用

inline fun test(callBack: () -> Unit) {
    callBack()
}

fun test1() {
    println("before")
    test {
        return
    }
    println("after")
}
test1()
输出是

before  
after
before
所以我想知道为什么第一个内联函数中的return语句不起作用。为什么第一段代码不起作用?

根据文档:

(return)默认情况下,从最近的封闭函数或匿名函数返回。-

不带标签的return语句总是从用fun关键字声明的函数返回。-

事实上,我会回复这个问题:为什么它在第二个例子中有效?答案是:

在Kotlin中,我们只能使用普通的、非限定的返回来退出命名函数或匿名函数。这意味着要退出lambda,我们必须使用一个标签,并且lambda内部禁止裸返回,因为lambda不能使封闭函数返回(…)。但是如果lambda传递给的函数是内联的,那么返回也可以是内联的,因此是允许的。 --


您可以使用kotlin交叉内联

Crossinline允许您标记lambda,以禁止它使用非本地返回。如果您还记得,内联lambda将return解释为非本地返回,并且在非内联lambda上不允许return

fun main(args: Array<String>) {
    test1()
}


inline fun test(crossinline callBack: () -> Unit) {
    callBack()
}

fun test1() {
    println("before")
    test {
        return@test
    }
    println("after")
}
fun main(args:Array){
test1()
}
内联乐趣测试(交叉内联回调:()->单元){
回调函数()
}
趣味测试1(){
println(“之前”)
试验{
return@test
}
println(“之后”)
}

然后输出将是has expectes

,因为内联函数中的返回是从该函数返回的,而不是从其内联的函数返回的。