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("Հետո անվտանգ աշխատանքը") // Այս տպավորությունը կկատարվի
}
Երբ է դա օգտակար:
- Երբ ուզում եք ապահովել, որ
crossinlinelambda-ից հետո կոդը կկատարվի (օրինակ՝try-finallyբլոկներում): - Երբ lambda-ն փոխանցվում է որպես արգումենտ այլ ֆունկցիային, որը կարող է չլինել inline, և դուք ուզում եք կանխել
non-local return-ը, որը կարող է խաթարել կատարման հոսքը։