Junior
Mis on 'scope functions' Kotlinis ja millal neid kasutada?
sobes.tech AI
Vastus AI-lt
Scope funktsioonid võimaldavad käivitada koodiploki objekti kontekstis. Peamised funktsioonid: let, run, with, apply, also. Igal on omadused, mis puudutavad saajat (invoker, receiver) ja tagastatavat väärtust.
| Funktsioon | Saaja | Tagastatav väärtus |
|---|---|---|
let |
it |
Bloki viimase avaldise tulemus |
run |
this |
Bloki viimase avaldise tulemus |
with |
this (kui laiendusmeetod) |
Bloki viimase avaldise tulemus |
apply |
this |
Objekti enda pärast seadistamist |
also |
it |
Objekti enda pärast seadistamist |
Kasutamine:
let: Objektiga tehtavate toimingute jaoks, mis võib olla null, või lokaalse muutuja sisestamiseks lühema nimega.
// Näide: turvaline meetodi kutsumine nullable objekti peal
val str: String? = "Hello"
str?.let {
println(it.length) // Toimib ainult, kui str ei ole null
}
run: Koodiploki käivitamine objekti kontekstis (naguwith), kuid kui laiendusmeetod, või kui vaja arvutada väärtus objekti kontekstis.
// Näide: objekti seadistamine ja tulemuse saamine
val configurations = buildList {
add("Config 1")
add("Config 2")
}.run {
println("Applying configurations...")
joinToString(", ") // Käivitub List<String> kontekstis, tagastab String
}
println(configurations)
with: Objektile meetodite kutsumise grupeerimine ilma iga kord "punkt" kasutamata.
// Näide: objekti meetodite kutsumine grupina
val person = Person("Alice", 30)
with(person) {
println(name) // Otse juurdepääs omadustele
println(age)
}
apply: Objekti seadistamiseks. Tagastab seadistatud objekti. Mugav uute objektide loomisel ja initsialiseerimisel.
// Näide: objekti loomine ja seadistamine ühes lauses
val button = Button().apply {
text = "Click Me"
onClick = { println("Button clicked") }
}
also: Täiendavate tegevuste tegemiseks objekti peal, näiteks logimine, pärast teatud operatsiooni. Tagastab objekti.
// Näide: tegevuse järel logimine
val number = 42
val squared = number.also {
println("Processing number: $it") // Toimub `it` (number) peal, tagastab number
}.run {
this * this // Toimub `this` (number) peal, tagastab ruudu
}
println("Squared value: $squared")
Õige scope funktsiooni valik sõltub sellest, mida soovite objekti peal teha ja millist väärtust soovite saada.