关于android:Kotlin:“ return @”是什么意思?

Kotlin: Whats does “return@” mean?

我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并且在映射flatMap lambda(java中的Func1)之一中,中间体返回看起来像以下@Func1

我不知道这是什么意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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语法用于指定此语句从多个嵌套函数中返回哪个函数。

它与函数文字(lambda)和局部函数一起使用。未标记的return语句从最近的(即最里面的)封闭的fun返回(忽略lambda)。考虑以下功能:

1
2
3
4
5
6
fun foo(ints: List<Int>) {
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}

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

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

1
2
3
4
5
6
fun foo(ints: List<Int>) {
    ints.forEach {
        if (it == 0) return@forEach // implicit label for lambda passed to forEach
        print(it)
    }
}

1
2
3
4
5
6
7
8
9
10
11
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"]

Lambda的非本地返回(即从外部函数返回)仅支持本地和内联函数,因为如果未内联Lambda(或将函数放置在对象内部),则不能保证仅在内部调用封闭函数(例如,可以将其存储在变量中,然后再调用),在这种情况下,非本地返回将毫无意义。

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


return@name决定应为其应用闭包return语句。

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

通常,您可以省略@name

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