Kotlin:“return @”是什么意思?
我在我的一个项目中使用了RxJava,我使用Android Studio插件将其中的一个类转换为Kotlin,在flatMap
lambda(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) })
在Kotlin中, return@label
语法用于指定这个语句返回的几个嵌套的函数中的哪一个函数。
它适用于函数文字(lambdas)和本地函数。 非标记的return
语句从最近的(即最内层的)封闭fun
(忽略lambdas)。 考虑这个功能:
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"]
使用本地功能:
fun outer(): Int { fun inner(i: Int) { if (i < 0) return // this returns from `inner` -- the innermost fun if (i % 2 == 0) return@outer 0 // label is required to return from `outer` } inner(2) return 1 }
lambda的非局部返回 (即从外部函数返回)只支持局部和内联函数,因为如果lambda没有内联(或者函数放在一个对象内部),不保证只在内部调用封闭函数(例如,它可以存储在一个变量中,稍后调用),而非本地返回在这种情况下是没有意义的。
还有一个类似的语法来限定this
,它被用来引用外部作用域的接收者: this@outer
。
return@name
确定应该应用哪个闭包return
语句。
在Kotlin中,可以调用从嵌套闭包返回来完成外闭包。 在Java中是不可能的。
通常,你可以省略@name
。
在你的例子中,你不能忽略它,因为Func1
被用在另一个函数中。