Sobes.tech
Middle+

Модификатори `crossinline` дар Kotlin барои чӣ истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

Модификатори crossinline истифода мешавад барои нишон додани параметрҳои lambda дар функсияҳои inline.

Ин ба компилятор нишон медиҳад, ки lambda-роҳояти дахлдор наметавонад non-local return (яъне, истифодаи фармони return барои хориҷ шудан аз функсияи беруна) кунад. Аммо, lambda ҳоло ҳам метавонад дар ҷойи даъват inlined шавад (inlined).

Масалан:

// Функсияи inline оддӣ бо қайти ғайриҳолӣ
inline fun runTask(task: () -> Unit) {
    task() // Қайти ғайриҳолӣ аз task() имконпазир аст
    println("Вазифа анҷом ёфт")
}

// Функсияи inline бо параметри crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // блок try-finally ҳамчун мисол, ки дар он crossinline зарур аст
    try {
        task() // НАДОИСТ, ки аз task() қайти ғайриҳолӣ накунед
    } finally {
        println("Тоза кардан")
    }
    println("Вазифаи бехатар анҷом ёфт")
}

fun main() {
    // Истифодаи runTask
    runTask {
        println("Дар дохили lambda-и runTask")
        return // ИЗЗАТ: қайти ғайриҳолӣ аз main()
    }
    // Намоиши "Вазифа анҷом ёфт" НАМЕОЯТ

    // Истифодаи runSafeTask
    runSafeTask {
        println("Дар дохили lambda-и runSafeTask")
        // return // ХАТОИ КОМПИЛЯТОР: қайти ғайриҳолӣ манъ аст
    }
    println("Пас аз вазифаи бехатар") // Ин нусха иҷро мешавад
}

Вақте ки ин муфид аст:

  • Вақте, ки мехоҳед, ки пас аз даъвати lambda-и crossinline коди иҷро шавад (масалан, дар блокҳои try-finally).
  • Вақте, ки lambda ҳамчун аргумент ба функсияи дигар дода мешавад, ки шояд inline набошад, ва шумо мехоҳед, ки қайти ғайриҳолӣ манъ карда шавад, ки метавонад ҷараёни иҷроиро вайрон кунад.