web-dev-qa-db-ja.com

Kotlin:「return @」とはどういう意味ですか?

私のプロジェクトの1つでRxJavaを使用しています。Android Studioプラグインを使用し、マップflatMap lambda(JavaのFunc1)の1つを使用して、クラスの1つをKotlinに変換しました。 、中間体は次の@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)
})
51
Glenn Sonna

コトリンでは、 return@label構文 は、このステートメントが返す複数のネストされた関数の中でどの関数を指定するために使用されます。

関数リテラル(ラムダ)とローカル関数で動作します。ラベルのないreturnステートメントは、funを囲む最も近い(つまり最も内側の)ものから戻ります(ラムダを無視します)。次の機能を検討してください。

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

ここで、returnは、ラムダだけでなく、fooの実行を終了します。

ただし、他の関数(ラムダまたは外側の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"]

非ローカルリターン (外部関数からのリターン)ラムダからのサポートは ローカル および インライン 関数でのみサポートされます。ラムダがインライン化(​​または関数がオブジェクト内に配置されている)、囲んでいる関数内でのみ呼び出されることは保証されません(たとえば、変数に格納して後で呼び出すことができます)。場合。


qualified this にも同様の構文があり、外部スコープのレシーバーを参照するために使用されます:this@outer

60
hotkey

return@nameは、どのクロージャーreturnステートメントを適用するかを決定します。

Kotlinでは、ネストされたクロージャーからreturnを呼び出して、外部クロージャーを終了できます。 Javaでは不可能です。

通常、@nameは省略できます。

この例では、Func1が別の関数内で使用されているため、省略できません。

7
klimat