Middle+
Kotlin-ში crossinline საკვანძო სიტყვა რა მიზნით გამოიყენება?
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() შეძლებდა დაბრუნებას runAsyncAndFinish-დან
// რაც შეუძლებელია სხვა ნაკადიდან, ვიდრე ის, რომელიც გამოიძახა
}
fun testCrossinline() {
println("წინ runAsyncAndFinish")
runAsyncAndFinish {
println("ასინქრონული ბლოკის შიგნით")
// return // კომპილაციის შეცდომა: არ შეიძლება გამოყენება არაოფიციალური დაბრუნება crossinline-თან
}
println("შემდეგ runAsyncAndFinish")
}