Sobes.tech
Middle+

Kotlinде `crossinline` модификатору эмне үчүн колдонулат?

sobes.tech AI

AIден жооп

crossinline өзгөрмөсү inline функцияларынын lambda параметрлерин белгилөө үчүн колдонулат.

Ал компиляторго көрсөтөт, тиешелүү lambda non-local return (б.а. return буйругу менен тышкы функциядан чыгуу) жасай албайт деп. Бирок, lambda дагы эле чакыруу жеринде inlined болушу мүмкүн (inlined).

Мисал:

// Жөнөкөй inline функциясы, non-local return менен
inline fun runTask(task: () -> Unit) {
    task() // task()тан non-local return мүмкүн
    println("Иш аяктады")
}

// crossinline параметри менен inline функциясы
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally блок мисалы, анда crossinline керек
    try {
        task() // task()тан non-local return жасоо тыюу салынган
    } finally {
        println("Тазалоо")
    }
    println("Коопсуз иш аяктады")
}

fun main() {
    // runTask колдонуу
    runTask {
        println("runTask ичиндеги lambda")
        return // ИЗЗАТ: main()тан non-local return
    }
    // "Иш аяктады" басып чыгуу ЖОК

    // runSafeTask колдонуу
    runSafeTask {
        println("runSafeTask ичиндеги lambda")
        // return // КОМПИЛЯТОРДУН КАТА: тыюу салынган non-local return
    }
    println("Коопсуз иштен кийин") // Бул басып чыгуу аткарылат
}

Кайда пайдалуу:

  • crossinline lambda чакырылган соң код ишке ашуусун камсыз кылгыңыз келсе (мисалы, try-finally блокторунда).
  • Lambda башка функцияга аргумент катары берилсе жана ал inline эмес болсо, жана сиз non-local return-ду алдын алгыңыз келсе, бул пайдалуу.