Sobes.tech
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 (jako with), 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.