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("Коопсуз иштен кийин") // Бул басып чыгуу аткарылат
}
Кайда пайдалуу:
crossinlinelambda чакырылган соң код ишке ашуусун камсыз кылгыңыз келсе (мисалы,try-finallyблокторунда).- Lambda башка функцияга аргумент катары берилсе жана ал inline эмес болсо, жана сиз non-local return-ду алдын алгыңыз келсе, бул пайдалуу.