Ответ 1
В Kotlin используется [email protected]
синтаксис, чтобы указать, какая функция из нескольких вложенных из них возвращает этот оператор.
Он работает с литералами функций (lambdas) и локальными функциями. Немаркированные операторы return
возвращаются с ближайшего (то есть самого внутреннего), охватывающего fun
(игнорируя lambdas). Рассмотрим эту функцию:
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) [email protected] // implicit label for lambda passed to forEach
print(it)
}
}
fun foo(ints: List<Int>): List<String> {
val result = ints.map [email protected]{
if (it == 0) [email protected] "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"]
Нелокальное возвращение (т.е. возврат из внешних функций) из лямбда поддерживается только для local и inline, потому что если лямбда не включена (или функция помещается внутри объекта), он не может быть вызван только внутри закрывающей функции (например, он может быть сохранен в переменной и вызван позже), а нелокальный возврат не имеет смысла в этом случае.
Существует также аналогичный синтаксис квалифицированный this
, который используется для ссылки на приемники внешних областей: [email protected]
.