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