Back to questions
Иннотех
СБЕР Автотех
Junior — Middle
72
Можете объяснить, что такое функция с использованием crossinline в Kotlin и в чем ее отличие от обычных inline-функций?
Companies where asked
Effective Technologies
Willdberies
Answer from AI
sobes.tech AI
В Kotlin ключевое слово inline используется для функций, чтобы компилировать их код непосредственно в места вызова, что уменьшает накладные расходы на вызов функции и позволяет использовать non-local returns и reified типы.
Параметр crossinline применяется к лямбда-выражениям, передаваемым в inline-функции, чтобы запретить использование non-local return из этой лямбды.
Отличия:
- Обычная inline-функция позволяет лямбдам с параметрами без
crossinlineиспользовать non-local return, то есть выйти из внешней функции. - Если параметр лямбды помечен как
crossinline, то внутри этой лямбды нельзя использовать non-local return, что предотвращает выход из внешней функции.
Это полезно, когда лямбда вызывается не напрямую, а, например, внутри другого лямбда-выражения или асинхронно, где non-local return невозможен или нежелателен.
Пример:
inline fun foo(crossinline block: () -> Unit) {
val runnable = Runnable {
block() // non-local return запрещен из-за crossinline
}
runnable.run()
}
fun main() {
foo {
println("Inside crossinline lambda")
// return // Ошибка: non-local return запрещен
}
println("After foo")
}
Таким образом, crossinline гарантирует, что лямбда не сможет прервать выполнение внешней функции через non-local return, что важно для корректности и безопасности кода.