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@”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章