Sobes.tech
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")
}