Запрет внешнего возврата в Kotlin
Встраиваемая функция может передать лямбду
дальше - например, в другой метод, который
вызовет ее позже или из другого контекста.
В такой вложенной точке нелокальный return
уже не имеет ясной внешней функции.
Параметр, который уходит во вложенный вызов,
помечают crossinline. Лямбда по-прежнему
разворачивается, но return из ее тела
не может завершить функцию, объявленную снаружи
обертки:
inline fun onReady(crossinline action: () -> Unit) {
readyQueue.add {
action()
}
}
val readyQueue = mutableListOf<() -> Unit>()
fun drainReady() {
readyQueue.forEach { step -> step() }
readyQueue.clear()
}
Блок попадает в список через еще одну лямбду.
Без ограничения crossinline компилятор
не разрешил бы такую цепочку из-за риска
нелокального выхода. Локальный return
внутри переданного блока по-прежнему относится
только к этому блоку. Проверка с простым текстом:
fun main() {
onReady { println("loaded") }
drainReady()
}
Сделайте функцию, которая регистрирует лямбду
в списке задач и вызывает ее позже через
отдельный метод runTasks. Убедитесь,
что блок выполняется после регистрации.
Добавьте вторую обертку: она принимает лямбду
и передает ее в repeat с фиксированным
числом повторений 3. Выведите одну
строку "ping" ровно три раза.