android - single - Kotlin: ¿Qué significa "return @"?
rxjava kotlin android tutorial (2)
En Kotlin, la
sintaxis
return@label
se usa para especificar qué función entre varias anidadas devuelve esta declaración.
Funciona con funciones literales (lambdas) y funciones locales.
Las declaraciones de retorno no etiquetadas
return
de la
fun
cierre más cercana (es decir, la más interna) (ignorando las lambdas).
Considere esta función:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Aquí,
return
terminará la ejecución de
foo
, no solo la lambda.
Pero si desea regresar de cualquier otra función (una lambda o una
fun
externa) debe especificarla como una etiqueta en la declaración de
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"]
El retorno no local (es decir, el retorno de funciones externas) de un lambda solo se admite para funciones local e inline , porque si un lambda no está en línea (o una función se coloca dentro de un objeto), no se garantiza que se invoque solo dentro la función de cierre (por ejemplo, puede almacenarse en una variable y llamarse más tarde), y el retorno no local no tendría sentido en este caso.
También hay una sintaxis similar para
this
calificado
, que se utiliza para hacer referencia a receptores de ámbitos externos:
this@outer
.
Estoy usando RxJava en uno de mis proyectos, convertí una de mis clases a Kotlin usando el complemento de Android Studio y en uno de map
flatMap
lambda (Func1 en java), los retornos intermedios se parecen a los siguientes
@Func1
.
No tengo idea de lo que esto significa.
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)
})
return@name
determina a qué cierre se debe aplicar la declaración de
return
.
En Kotlin, puede llamar al retorno del cierre anidado para finalizar el cierre externo. En Java no es posible.
Por lo general, puede omitir
@name
.
En su ejemplo, no puede omitirlo porque
Func1
se usa dentro de otra función.