Sobes.tech
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, что важно для корректности и безопасности кода.