Kotlin:什么是"返回@"是什么意思?

Gle*_*nna 55 android kotlin rx-java

我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并在一个map flatMaplambda(java中的Func1)中,中间件返回如下所示@Func1.

我不知道这是什么意思.

something.flatMap(Func1<ArticleCriteria, Observable<Pair<String, String>>> {
    val isTemporaryClone = it.isATemporaryClone
    val isTheOriginalToken = it.tokenIsOriginalHere

    if (isTemporaryClone) {
        if (!isTheOriginalToken) {
            return@Func1 paramsError("Token is always original for temp articles")
        }

        return@Func1 mJobRunner.doNotRun(DeleteArticleJob.TAG)
                            .doOnNext(deletePersonalActionById(articleId))
    }

    runArticleJobAsync(DeleteArticleJob.TAG, it)
})
Run Code Online (Sandbox Code Playgroud)

hot*_*key 67

在Kotlin中,return@label语法用于指定此语句返回的几个嵌套的函数.

它适用于函数文字(lambdas)和本地函数.未标记的return语句从最近的(即最里面的)封闭fun(忽略lambdas)返回.考虑这个功能:

fun foo(ints: List<Int>) {
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,return将完成执行foo,而不仅仅是lambda.

但是如果你想从任何其他函数(lambda或外部函数)返回,fun你必须在return语句中将其指定为标签:

fun foo(ints: List<Int>) {
    ints.forEach {
        if (it == 0) return@forEach // implicit label for lambda passed to forEach
        print(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

fun foo(ints: List<Int>): List<String> {
    val result = ints.map f@{
        if (it == 0) return@f "zero" // return at named label
        if (it == -1) return emptyList() // return at foo
        "number $it" // expression returned from lambda
    }
    return result
}

foo(listOf(1, -1, 1)) // []
foo(listOf(1, 0, 1)) // ["number 1", "zero", "number 1"]
Run Code Online (Sandbox Code Playgroud)

lambda中的非局部返回(即从外部函数返回)仅支持本地函数和内联函数,因为如果没有内联lambda(或函数放在对象内),则不保证仅在内部调用封闭函数(例如,它可以存储在变量中并稍后调用),在这种情况下非局部返回是没有意义的.


还有一个类似的语法为合格this,其被用来引用外部范围的接收机:this@outer.

  • 谢谢!如果 Kotlin 官方文档能够像您在这里所做的那样通过示例更详细地介绍这一点,那就太好了。 (3认同)
  • @hotkey本地函数示例不可编译。编译器在return @ outer 0上说“此处不允许返回” (2认同)

kli*_*mat 7

return@name确定return应该应用哪个闭包语句.

在Kotlin中,您可以从嵌套闭包调用return来完成外部闭包.在Java中,这是不可能的.

通常,您可以省略@name.

在您的示例中,您不能省略它,因为Func1在另一个函数中使用.

  • 如果代码写在函数体内,则不能省略`@Func1`。 (2认同)