Kotlin: Was bedeutet “return@”?

Lesezeit: 3 Minuten

Kotlin Was bedeutet return@
Glen Sonna

Ich verwende RxJava in einem meiner Projekte, ich habe eine meiner Klassen mit dem Android Studio-Plugin und in einer der Karten in Kotlin konvertiert flatMap Lambda (Func1 in Java), Zwischenrückgaben sehen wie folgt aus @Func1.

Ich habe keine Ahnung, was das bedeutet.

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

1647212586 431 Kotlin Was bedeutet return@
Hotkey

In Kotlin, der return@label Syntax wird verwendet, um anzugeben, von welcher Funktion unter mehreren verschachtelten diese Anweisung zurückkehrt.

Es arbeitet mit Funktionsliteralen (Lambdas) und lokalen Funktionen. Unbeschriftet return Anweisungen kommen von der nächsten (dh innersten) Umschließung zurück fun (Lambdas ignorieren). Betrachten Sie diese Funktion:

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

Hier, return wird die Ausführung von beenden foonicht nur das Lambda.

Wenn Sie jedoch von einer anderen Funktion (einer Lambda- oder einer äußeren fun) müssen Sie es als Label bei angeben return Aussage:

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

Nicht-lokale Rückkehr (dh Rückgabe von äußeren Funktionen) von einem Lambda wird nur für unterstützt lokal und in der Reihe Funktionen, denn wenn ein Lambda nicht inline ist (oder eine Funktion in ein Objekt platziert wird), ist es nicht garantiert, dass es nur innerhalb der einschließenden Funktion aufgerufen wird (z. B. kann es in einer Variablen gespeichert und später aufgerufen werden), und die nicht- Eine lokale Rückgabe würde in diesem Fall keinen Sinn machen.


Es gibt auch eine ähnliche Syntax für qualifiziert thisdas verwendet wird, um Empfänger von äußeren Bereichen zu referenzieren: this@outer.

  • Danke! Es wäre schön gewesen, wenn die offiziellen Kotlin-Dokumente dies etwas ausführlicher mit Beispielen behandelt hätten, wie Sie es hier getan haben.

    – Michael Petersen

    13. Juni 2017 um 18:32 Uhr

1647212587 964 Kotlin Was bedeutet return@
klimat

return@name bestimmt für welche Schließung return Aussage angewendet werden soll.

In Kotlin können Sie die Rückkehr von der verschachtelten Schließung aufrufen, um die äußere Schließung zu beenden. In Java ist dies nicht möglich.

In der Regel können Sie darauf verzichten @name.

In Ihrem Beispiel können Sie es nicht weglassen, weil Func1 wird innerhalb einer anderen Funktion verwendet.

  • Wenn der Code in einen Funktionskörper geschrieben wird, @Func1 kann nicht weggelassen werden.

    – Hotkey

    21. Oktober 2016 um 9:41 Uhr

  • Könnten Sie näher erläutern, unter welchen Bedingungen @Func1 kann ausgelassen werden? Ich habe versucht, den Ausdruck zu verwenden something.flatMap(...) in einer Top-Level-Erklärung, aber ich habe die “return ist hier nicht erlaubt” Fehler.

    – Hotkey

    21. Oktober 2016 um 10:09 Uhr


  • Danke! Sowohl die Antworten von @hotkey als auch von mklimek sind richtig, die Antwort von hotkey ist nur etwas ausführlicher. Ich stimme beiden zu und überprüfe die von hotkey 🙂

    – Glen Sonna

    21. Oktober 2016 um 12:10 Uhr


  • Ist es möglich, es für zu verwenden when (das Switch-Case-Äquivalent auf Kotlin) ? Oft möchte ich es brechen, wenn die Einkerbung zu groß ist …

    – Android-Entwickler

    15. Juli 2019 um 18:05 Uhr

999280cookie-checkKotlin: Was bedeutet “return@”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy