Ответ
crossinline используется в inline функциях для запрета нелокального возврата (return) из лямбды, переданной в такую функцию.
Проблема:
В обычной inline функции return внутри лямбды завершает внешнюю функцию, что может быть неожиданно:
inline fun runInline(block: () -> Unit) {
block()
}
fun main() {
runInline {
println("Before return")
return // Неожиданно завершает main()
}
println("This won't execute")
}
Решение:
Добавляем crossinline, чтобы запретить return:
inline fun runCrossInline(crossinline block: () -> Unit) {
block()
}
fun main() {
runCrossInline {
println("Before return")
// return // Ошибка компиляции: Can't return here
}
println("This will execute")
}
Где используется:
Чаще всего в асинхронных вызовах (например, view.post { ... }), где нелокальный return нарушил бы логику.