Sobes.tech
Junior

Šta su 'scope funkcije' u Kotlinu i kada ih treba koristiti?

sobes.tech АИ

Одговор од АИ

Функције обима омогућавају извршавање блока кода у контексту објекта. Основне функције: let, run, with, apply, also. Свака има своје особености у погледу примаоца (invoker, receiver) и вредности која се враћа.

Функција Прималац Враћена вредност
let it Резултат последњег израза у блоку
run this Резултат последњег израза у блоку
with this (као метод проширења) Резултат последњег израза у блоку
apply this Сам објекат након конфигурације
also it Сам објекат након конфигурације

Користи се:

  • let: За извршавање акција над објектом који може бити null, или за увођење локалне променљиве са краћим именом.
// Пример: безбедно позивање методе на nullable објекту
val str: String? = "Hello"
str?.let {
    println(it.length) // Извршава се само ако str није null
}
  • run: За извршавање блока кода у контексту објекта (као with), али као метод проширења, или када је потребно израчунати вредност у контексту објекта.
// Пример: конфигурација објекта и добијање резултата
val configurations = buildList {
    add("Config 1")
    add("Config 2")
}.run {
    println("Applying configurations...")
    joinToString(", ") // Извршава се у контексту List<String>, враћа String
}
println(configurations)
  • with: За груписање позива метода објекта без коришћења "тачке" пре сваког позива. Није метод проширења.
// Пример: груписање позива метода једног објекта
val person = Person("Alice", 30)
with(person) {
    println(name) // Доступ до својстава директно
    println(age)
}
  • apply: За конфигурацију објекта. Враћа сам конфигурисани објекат. Погодно за креирање и инициализацију објеката у једном изразу.
// Пример: креирање и конфигурација објекта у једном кораку
val button = Button().apply {
    text = "Click Me"
    onClick = { println("Button clicked") }
}
  • also: За извршавање додатних радњи над објектом, као што је логовање, након одређене операције. Враћа сам објекат.
// Пример: логовање након извршавања акције
val number = 42
val squared = number.also {
    println("Processing number: $it") // Извршава се над it (number), враћа number
}.run {
    this * this // Извршава се над this (number), враћа квадрат
}
println("Squared value: $squared")

Избор одговарајуће scope функције зависи од тога шта треба урадити са објектом и која вредност треба да буде враћена.