Sobes.tech
Middle+

რა მიზნით გამოიყენება `crossinline` მორფი Kotlin-ში?

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() // შესაძლებელი არის non-local return-ი from task()
    println("მოვალეობა დასრულდა")
}

// inline ფუნქცია crossinline პარამეტრით
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally ბლოკი მაგალითისთვის, სადაც საჭიროა crossinline
    try {
        task() // არ არის დაშვებული non-local return-ი from task()
    } finally {
        println("სუფთავება")
    }
    println("უსაფრთხო სამუშაო დასრულდა")
}

fun main() {
    // runTask-ის გამოყენება
    runTask {
        println("runTask-ის ლამბდა შიგნით")
        return // დაშვებულია: non-local return-ი main()-დან
    }
    // "მოვალეობა დასრულდა" არ შესრულდება

    // runSafeTask-ის გამოყენება
    runSafeTask {
        println("runSafeTask-ის ლამბდა შიგნით")
        // return // სავალდებულო შეცდომა: non-local return-ი აკრძალულია
    }
    println("უსაფრთხო სამუშაოს შემდეგ") // ეს პრინტი შესრულდება
}

როდის არის ეს სასარგებლო:

  • როდესაც გსურთ უზრუნველყოთ, რომ crossinline ლამბდის შემდეგ კოდი შესრულდება (მაგალითად, try-finally ბლოკებში).
  • როდესაც ლამბდი გადაეცემა სხვა ფუნქციას, რომელიც შესაძლოა არ იყოს inline, და გსურთ თავიდან აიცილოთ non-local return, რომელიც შეიძლება დაარღვიოს შესრულების ნაკადი.