Этот вопрос проверяет понимание поведения return в лямбдах внутри inline-функций и различий между локальным и нелокальным возвратом.
В Kotlin return в лямбде по умолчанию завершает внешнюю функцию (нелокальный возврат). Но если лямбда передана в inline-функцию, return работает так же, как если бы код был вставлен напрямую. Чтобы вернуться только из лямбды (локальный возврат), используйте return@label.
Обычно в Kotlin return внутри лямбды приводит к ошибке, потому что лямбда не знает, из какой функции нужно выйти. Но если функция объявлена как inline, компилятор вставляет её код напрямую, и return работает так же, как в обычном коде.
Пример:
inline fun runInline(block: () -> Unit) {
block()
}
fun main() {
runInline {
println("Before return")
return // Завершает main(), потому что runInline встроена
}
println("This won't print")
}Если нужно вернуться только из лямбды (а не из внешней функции), используйте локальный возврат с меткой:
fun main() {
listOf(1, 2, 3).forEach {
if (it == 2) return@forEach // Выходит только из лямбды forEach
println(it)
}
println("This will print")
}Вывод:
1
3
This will printТаким образом, inline-функции меняют поведение return, позволяя ему выходить из внешнего контекста, если не указана метка.