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")
}