En Kotlin, le return@label
syntaxe est utilisé pour spécifier quelle fonction, parmi plusieurs fonctions imbriquées, cette instruction retourne.
Il fonctionne avec les littéraux de fonction (lambdas) et les fonctions locales. Non étiqueté return
retournent à partir de l'instruction la plus proche (c.-à-d. la plus interne) de l'entourage. fun
(en ignorant les lambdas). Considérons cette fonction :
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Ici, return
terminera l'exécution de foo
et pas seulement le lambda.
Mais si vous voulez retourner de n'importe quelle autre fonction (une lambda ou une fonction externe fun
), vous devez le spécifier en tant qu'étiquette à l'endroit suivant return
déclaration :
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"]
Retour non-local (c'est-à-dire le retour des fonctions externes) à partir d'un lambda n'est supporté que pour les fonctions local et en ligne car si une lambda n'est pas inlined (ou si une fonction est placée à l'intérieur d'un objet), il n'est pas garanti qu'elle soit appelée uniquement à l'intérieur de la fonction englobante (par exemple, elle peut être stockée dans une variable et appelée plus tard), et le retour non-local n'aurait aucun sens dans ce cas.
Il existe également une syntaxe similaire pour qualifié this
qui est utilisé pour référencer les récepteurs des portées extérieures : this@outer
.