Лямбда без встраивания в Kotlin
У встраиваемой функции может быть несколько параметров-лямбд. Не каждый из них удобно разворачивать: иногда блок нужно сохранить или передать дальше, и тогда его нельзя просто вставить в вызывающий код.
Такой параметр помечают словом noinline
перед именем. Остальные лямбды при этом могут
встраиваться как обычно. Схема на двух блоках:
inline fun runNowAndLater(
now: () -> Unit,
noinline later: () -> Unit,
) {
now()
pending += later
}
val pending = mutableListOf<() -> Unit>()
Первый блок выполняется сразу внутри функции.
Второй попадает в список pending как
готовое значение - его вызовут позже из другого
места. Если бы его тоже развернули в точке
вызова, сохранить в коллекции было бы
невозможно:
fun main() {
runNowAndLater(
now = { println("setup") },
later = { println("cleanup") },
)
pending.forEach { step -> step() }
}
Объявите функцию с двумя лямбда-параметрами:
первую выполните сразу, вторую добавьте в
список отложенных шагов. В main
зарегистрируйте пару блоков и затем выполните
все отложенные по порядку.
Сделайте функцию, которая принимает основной
блок и блок-обработчик ошибок. Основной
выполните на месте, обработчик передайте
в поле класса Job для вызова позже.
Проверьте, что обработчик сохраняется и
доступен после выхода из функции.