0Pricing
Kotlin Academy · Урок

Как выбрать подходящую функцию области видимости

Выбирайте подходящую функцию области видимости с учётом получателя, типа результата и цели.

«Как выбрать подходящую функцию области видимости» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Пять функций и две характеристики

Функции Kotlin для работы с областью видимости различаются по двум характеристикам: стиль обращения к объекту-получателю (this или it) и возвращаемое значение (объект-получатель или результат лямбды). Выбирайте функцию исходя из намерения.

Матрица выбора

apply: this / объект-получатель. also: it / объект-получатель. run: this / лямбда. let: it / лямбда. with: this / лямбда (обращение к объекту-получателю не выполняется через точку).

apply: настройка и возврат

Используйте apply для настройки объекта в цепочке вызовов в стиле строителя.

class Config {
    var host: String = ""
    var port: Int = 0
}
fun main() {
    val cfg = Config().apply {
        host = "localhost"
        port = 8080
    }
    println("${cfg.host}:${cfg.port}")
}

also: побочные эффекты

Используйте also, чтобы записать данные в журнал, выполнить проверку или запустить побочный эффект, передав объект-получатель дальше.

fun main() {
    val items = listOf(1, 2, 3, 4)
        .also { println("got ${it.size} items") }
        .filter { it % 2 == 0 }
    println(items)
}

let: преобразование и безопасность null в области видимости

Используйте let для безопасных для null преобразований или ограничения области видимости переменной.

fun main() {
    val name: String? = "Ada"
    val length = name?.let { it.length } ?: 0
    println(length)
}

run: обращение к нескольким членам с результатом

Используйте run, когда вычисляете результат на основе нескольких членов объекта-получателя, — это избавляет от префиксов it..

class User(val name: String, val age: Int)
fun main() {
    val description = User("Ada", 35).run {
        "Name: $name, Age: $age"
    }
    println(description)
}

with: группировка операций над существующим объектом

Используйте with(obj) { ... }, когда место вызова Вам не принадлежит (цепочка вызовов через точку невозможна), но нужно сгруппировать операции, используя this.

class Builder {
    val parts = mutableListOf<String>()
    fun add(s: String) { parts.add(s) }
    fun build(): String = parts.joinToString("-")
}
fun main() {
    val b = Builder()
    val result = with(b) {
        add("hello")
        add("kotlin")
        build()
    }
    println(result) // hello-kotlin
}

Выбор по намерению

Спросите себя: (1) нужно ли вернуть объект-получатель или получить производный результат? (2) предпочтительнее this или it? Ответы подскажут нужную функцию.

class Box { var w = 0; var h = 0; fun area() = w * h }
fun main() {
    // Configure and return Box -> apply
    val box = Box().apply { w = 3; h = 4 }
    // Compute area from box -> let or run
    val area = box.let { it.area() }
    // Side effect, keep box -> also
    val sameBox = box.also { println("area=${it.area()}") }
    println("$box / $area / $sameBox")
}

Сравнение: apply и also

Обе функции возвращают объект-получатель. apply использует this (хорошо подходит для установки полей). also использует it (хорошо подходит для явной ссылки на объект-получатель, часто в побочных эффектах).

class Item { var name = "" }
fun main() {
    val a = Item().apply { name = "apply" } // implicit this
    val b = Item().also { it.name = "also" } // explicit it
    println("${a.name} / ${b.name}")
}

Сравнение: let и run

Обе функции возвращают результат лямбды. let использует it (хорошо подходит для простых преобразований и безопасной работы с null). run использует this (хорошо подходит, когда нужно вызвать много членов).

class Calculator(val a: Int, val b: Int) {
    fun sum() = a + b
    fun product() = a * b
}
fun main() {
    val calc = Calculator(3, 4)
    val s = calc.let { it.sum() }                  // simple
    val combo = calc.run { "sum=${sum()} product=${product()}" } // multi-member
    println("$s / $combo")
}

Практическая цепочка вызовов

В реальных цепочках часто используются вместе несколько функций для работы с областью видимости.

class Request(var url: String = "", var headers: Map<String, String> = emptyMap())
fun main() {
    val response = Request()
        .apply {
            url = "https://api.example.com"
            headers = mapOf("Accept" to "json")
        }
        .also { println("request: ${it.url}") }
        .let { req -> "GET ${req.url}" }
    println(response)
}

Шпаргалка

Краткая памятка по выбору подходящего инструмента.

// apply: this, returns receiver — configure object
// also: it, returns receiver — side effects in chain
// let: it, returns lambda result — transform / null-safety
// run: this, returns lambda result — multi-member compute
// with: this, returns lambda result — group operations on existing obj
fun main() { println("Scope functions: pick by receiver style + return value") }

Быстрая проверка

Какая функция для работы с областью видимости использует this как объект-получатель AND возвращает сам объект-получатель?

Итоги

Выбирайте функцию для работы с областью видимости по намерению: apply (настройка + возврат самого объекта), also (побочный эффект + возврат самого объекта), let (преобразование с помощью it), run (преобразование с помощью this), with (группировка операций над существующим объектом). Правильный выбор определяется двумя характеристиками — стилем обращения к объекту-получателю и возвращаемым значением.

Часто задаваемые вопросы

Урок «Как выбрать подходящую функцию области видимости» бесплатный?

Да — полный текст урока «Как выбрать подходящую функцию области видимости» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Как выбрать подходящую функцию области видимости»?

Выбирайте подходящую функцию области видимости с учётом получателя, типа результата и цели. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Как выбрать подходящую функцию области видимости»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. apply и with: настройка и возврат
  2. let и run: преобразование и область видимости
  3. also: побочные эффекты без изменения получателя
  4. Как выбрать подходящую функцию области видимости
← Назад к Kotlin Academy