Sobes.tech
Middle+

Ի՞նչ է օգտագործվում `crossinline` մոդիֆիկատորը Kotlin-ում։

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() // `non-local return`-ը հնարավոր է from task()
    println("Աշխատանքը ավարտվեց")
}

// crossinline պարամետրով inline ֆունկցիա
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally բլոկ օրինակ, որտեղ անհրաժեշտ է crossinline
    try {
        task() // ՉԻ ԹԵՐՔԵԼ, որ `non-local return`-ը կատարվի from task()
    } finally {
        println("Անջատում")
    }
    println("Անվտանգ աշխատանքը ավարտվեց")
}

fun main() {
    // runTask-ի օգտագործում
    runTask {
        println("Ներքևի lambda-ում")
        return // ԻՆՉՊԵՍ թույլատրվում է՝ main()-ից `non-local return`
    }
    // "Աշխատանքը ավարտվեց" տպավորությունը ՉԻ ԿԱՐՈՂ ՏԵՍՆԵԼ

    // runSafeTask-ի օգտագործում
    runSafeTask {
        println("Ներքևի lambda-ում")
        // return // Կոմպիլատորային սխալ՝ արգելված է `non-local return`
    }
    println("Հետո անվտանգ աշխատանքը") // Այս տպավորությունը կկատարվի
}

Երբ է դա օգտակար:

  • Երբ ուզում եք ապահովել, որ crossinline lambda-ից հետո կոդը կկատարվի (օրինակ՝ try-finally բլոկներում):
  • Երբ lambda-ն փոխանցվում է որպես արգումենտ այլ ֆունկցիային, որը կարող է չլինել inline, և դուք ուզում եք կանխել non-local return-ը, որը կարող է խաթարել կատարման հոսքը։