Scope functions выполняют блок в контексте объекта; отличаются receiver (this/it) и возвращаемым значением (объект или результат блока).
Разбор
let/also — it; run/apply/with — this.
apply/also возвращают receiver; let/run/with — результат лямбды.
let часто для null-check: x?.let { }.
apply — конфигурация объекта (builder-style).
Пример
val user = User().apply { name = "Ann"; age = 30 }
val len = name?.let { it.length }
Итог
Выбор scope function = кто receiver и что возвращаем.