Sobes.tech
Middle+

Ի՞նչ նպատակով է օգտագործվում crossinline բանալի բառը Kotlin-ում։

sobes.tech AI

Պատասխան AI-ից

crossinline օգտագործվում է Kotlin-ում ֆունկցիայի պարամետրերը նշելու համար inline ֆունկցիաներում: Սա թույլ է տալիս այդպիսի lambda պարամետրը կանչել ներսի ֆունկցիաների մեջ (օրինակ, անանուն դասի օբյեկտներ), որոնք չեն լինում inline:

Նորմալ lambda-ները inline ֆունկցիաներում կարող են պարունակել ոչ տեղական վերադարձներ (վերադարձներ, որոնք դուրս են գալիս արտաքին ֆունկցիայից): crossinline նշված lambda-ները չեն կարող պարունակել ոչ տեղական վերադարձներ:

Հիմնական նպատակ:

  • Հնարավորություն տալ lambda-ների օգտագործումը այն կոնտեքստերում, որտեղ ըստ նախնական, inline lambda-ները (համատեղ ոչ տեղական վերադարձի հնարավորությամբ) չեն կարող օգտագործվել (օրինակ, անանուն օբյեկտներ, տեղական ֆունկցիաներ):
  • Արգելել ոչ տեղական վերադարձները lambda-ներից, երբ դա ցանկալի կամ հնարավոր չէ կոդի կառուցվածքի պատճառով (օրինակ, երբ lambda-ները փոխանցվում են այլ թելին):

Օրինակ:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Անանուն Runnable օբյեկտ ստեղծել
    val runnable = object : Runnable {
        override fun run() {
            block() // crossinline lambda-ների օգտագործում ներսում
            // այստեղ block() չի կարող կատարել ոչ տեղական վերադարձ runAsyncAndFinish-ից
        }
    }
    // գործարկել առանձին թելում (օրինակ)
    Thread(runnable).start()
    // եթե block չլիներ crossinline, block() կարող էր կատարել return runAsyncAndFinish-ից
    // ինչը հնարավոր չէ այլ թելից, քան այն, որը կանչում է
}

fun testCrossinline() {
    println("Նախքան runAsyncAndFinish")
    runAsyncAndFinish {
        println("Անցում է ասինխրոնիկ բլոկ")
        // return // Կոմպիլյատորային սխալ: չի թույլատրվում օգտագործել ոչ տեղական return crossinline-ով
    }
    println("Հետո runAsyncAndFinish")
}