Middle+
Zašto se koristi ključna reč crossinline u Kotlinu?
sobes.tech АИ
Одговор од АИ
crossinline се користи у Kotlin-у за означавање параметара функција у inline функцијама. Ово омогућава позивање таквог lambda параметра унутар унутрашњих функција (као што су објекти анонимних класа) које нису inline.
Обични lambda-ји у inline функцијама могу садржати нелокалне повратке (повратке које излазе из спољашње функције). Lambda означена са crossinline не може садржати нелокалне повратке.
Главни циљ:
- Омогућити коришћење 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")
}