Ответ
В Kotlin есть несколько scope-функций для работы с объектами в контексте:
let- выполняет блок кода с объектом как аргумент (it), возвращает результат блока
val length = str?.let {
println(it)
it.length
}
run- аналогично let, но доступ к объекту через this, возвращает результат блока
val result = service.run {
port = 8080
start()
}
with- как run, но не extension-функция
with(config) {
println(host)
timeout = 5000
}
apply- работает с объектом как this, возвращает сам объект
val dialog = Dialog().apply {
setTitle("Hello")
setCancelable(true)
}
also- как apply, но доступ через it, возвращает объект
val list = mutableListOf(1,2).also {
it.add(3)
}
Выбор зависит от необходимости: нужен ли результат (let/run/with) или модификация объекта (apply/also), и как удобнее обращаться к объекту (this/it).