Kotlin:“return@”是啥意思?

Posted

技术标签:

【中文标题】Kotlin:“return@”是啥意思?【英文标题】:Kotlin: Whats does "return@" mean?Kotlin:“return@”是什么意思? 【发布时间】:2017-03-02 19:28:22 【问题描述】:

我在我的一个项目中使用 RxJava,我使用 android Studio 插件将我的一个类转换为 Kotlin,并在其中一个映射 flatMap lambda(Java 中的 Func1)中,中间返回类似于以下 @987654322 @。

我不知道这意味着什么。

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)
)

【问题讨论】:

【参考方案1】:

在 Kotlin 中,return@label syntax 用于指定该语句从几个嵌套函数中返回的函数。

它适用于函数字面量 (lambdas) 和本地函数。未标记的return 语句从最近的(即最里面的)包围fun(忽略lambda)返回。考虑这个函数:

fun foo(ints: List<Int>) 
    ints.forEach 
        if (it == 0) return
        print(it)
    

这里,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)
    

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"]

Non-local return(即从外部函数返回)仅支持 local 和 inline 函数,因为如果 lambda 未内联(或函数放置在对象内),则不会保证只在封闭函数内部调用(例如,它可以存储在变量中并稍后调用),并且在这种情况下非本地返回没有意义。


qualified this 也有类似的语法,用于引用外部作用域的接收者:this@outer

【讨论】:

谢谢!如果 Kotlin 官方文档像您在此处所做的那样通过示例更详细地介绍这一点,那就太好了。【参考方案2】:

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

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

通常,您可以省略@name

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

【讨论】:

如果代码写在函数体内,@Func1不能省略。 您能否详细说明在哪些情况下可以省略@Func1?我尝试在***声明中使用表达式 something.flatMap(...),但出现“return is not allowed here”错误。 谢谢! @hotkey 和 mklimek 的答案都是正确的,hotkey 的答案只是更详细一点我都赞成并检查 hotkey 的 :) 是否可以将它用于when(Kotlin 上的 switch-case 等效项)?很多时候我想在压痕太多的时候打破它......

以上是关于Kotlin:“return@”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程中的挂起函数是啥意思?

kotlin 中的 out 关键字是啥

“return $this”是啥意思?

return是啥意思

C++11 中的“return ”语句是啥意思?

return是啥意思 return的汉语释义