Junior
Co jsou 'scope funkce' v Kotlinu a kdy je používat?
sobes.tech AI
Odpověď od AI
Scope funkce umožňují spouštět blok kódu v kontextu objektu. Hlavní funkce jsou: let, run, with, apply, also. Každá má své vlastnosti týkající se příjemce (invoker, receiver) a hodnoty, kterou vrací.
| Funkce | Příjemce | Vrácená hodnota |
|---|---|---|
let |
it |
Výsledek posledního výrazu v bloku |
run |
this |
Výsledek posledního výrazu v bloku |
with |
this (ne jako rozšiřující metoda) |
Výsledek posledního výrazu v bloku |
apply |
this |
Sám nakonfigurovaný objekt |
also |
it |
Sám nakonfigurovaný objekt |
Použití:
let: Pro provádění akcí na objektu, který může být null, nebo pro zavedení lokální proměnné s kratším názvem.
// Příklad: bezpečné volání metody na nullable objektu
val str: String? = "Hello"
str?.let {
println(it.length) // Bude provedeno pouze pokud str není null
}
run: Pro spuštění bloku kódu s kontextem objektu (jakowith), ale jako rozšiřující metoda, nebo když je třeba vypočítat hodnotu v kontextu objektu.
// Příklad: konfigurace objektu a získání výsledku
val configurations = buildList {
add("Config 1")
add("Config 2")
}.run {
println("Použití konfigurací...")
joinToString(", ") // Běží v kontextu List<String>, vrací String
}
println(configurations)
with: Pro seskupení volání metod objektu bez použití "tečky" před každým voláním. Není to rozšiřující metoda.
// Příklad: seskupení volání metod jednoho objektu
val person = Person("Alice", 30)
with(person) {
println(name) // Přímý přístup ke vlastnostem
println(age)
}
apply: Pro konfiguraci objektu. Vrací samotný nakonfigurovaný objekt. Užitečné pro vytváření a inicializaci objektů v jednom výrazu.
// Příklad: vytvoření a konfigurace objektu v jednom kroku
val button = Button().apply {
text = "Click Me"
onClick = { println("Tlačítko kliknuto") }
}
also: Pro provádění dalších akcí na objektu, například logování, po nějaké operaci. Vrací samotný objekt.
// Příklad: logování po provedení akce
val number = 42
val squared = number.also {
println("Zpracování čísla: $it") // Běží na it (number), vrací number
}.run {
this * this // Běží na this (number), vrací čtverec
}
println("Hodnota čtverce: $squared")
Volba vhodné scope funkce závisí na tom, co chcete s objektem udělat a jakou hodnotu má vrátit.