Junior
Čo sú 'scope funkcie' v Kotlin a kedy ich použiť?
sobes.tech AI
Odpoveď od AI
Funkcie rozsahu umožňujú vykonávať blok kódu v kontexte objektu. Hlavné funkcie: let, run, with, apply, also. Každá má svoje špecifiká týkajúce sa príjemcu (invoker, receiver) a vrátenej hodnoty.
| Funkcia | Príjemca | Vrátená hodnota |
|---|---|---|
let |
it |
Výsledok posledného výrazu v bloku |
run |
this |
Výsledok posledného výrazu v bloku |
with |
this (ako rozširujúca metóda) |
Výsledok posledného výrazu v bloku |
apply |
this |
Sám objekt po nastavení |
also |
it |
Sám objekt po nastavení |
Použitie:
let: Na vykonanie akcií nad objektom, ktorý môže byť null, alebo na zavedenie lokálnej premennej s kratším menom.
// Príklad: bezpečné volanie metódy na nullable objekte
val str: String? = "Hello"
str?.let {
println(it.length) // Bude vykonané iba ak str nie je null
}
run: Na vykonanie bloku kódu s kontextom objektu (akowith), ale ako rozširujúca metóda, alebo keď je potrebné vypočítať hodnotu v kontexte objektu.
// Príklad: nastavenie objektu a získanie výsledku
val configurations = buildList {
add("Config 1")
add("Config 2")
}.run {
println("Applying configurations...")
joinToString(", ") // Vykonáva sa v kontexte List<String>, vracia String
}
println(configurations)
with: Na skupinové volanie metód objektu bez použitia "bodky" pred každým volaním. Nie je rozširujúcou metódou.
// Príklad: skupinové volanie metód jedného objektu
val person = Person("Alice", 30)
with(person) {
println(name) // Priamy prístup ku vlastnostiam
println(age)
}
apply: Na nastavenie objektu. Vráti samotný nakonfigurovaný objekt. Vhodné na vytváranie a inicializáciu objektov v jednom výraze.
// Príklad: vytvorenie a nastavenie objektu v jednom kroku
val button = Button().apply {
text = "Click Me"
onClick = { println("Button clicked") }
}
also: Na vykonanie ďalších akcií nad objektom, ako je logovanie, po určitej operácii. Vráti samotný objekt.
// Príklad: logovanie po vykonaní akcie
val number = 42
val squared = number.also {
println("Processing number: $it") // Vykonáva sa nad it (number), vracia number
}.run {
this * this // Vykonáva sa nad this (number), vracia štvorca
}
println("Squared value: $squared")
Výber vhodnej scope funkcie závisí od toho, čo je potrebné s objektom urobiť a aká hodnota má byť vrátená.