Kotlin Academy · Урок

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

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

Урок 1 из 413 шагов

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

Повторение функций области видимости

Функции области видимости Kotlin (apply, also, let, run, with) позволяют выполнить блок в контексте объекта. Каждая из них отличается получателем (this или it) и возвращаемым значением.

Основы apply

apply { ... } выполняет блок, привязывая this к получателю, и возвращает сам получатель. Идеально подходит для настройки объекта.

class Person {
    var name: String = ""
    var age: Int = 0
}
fun main() {
    val p = Person().apply {
        name = "Ada"
        age = 35
    }
    println("${p.name}, ${p.age}")
}

Почему apply полезна

Без apply Вам потребовалась бы временная переменная, чтобы настроить объект, а затем вернуть его. apply сжимает это до одного выражения.

class Config {
    var host: String = ""
    var port: Int = 0
}
fun makeConfig(): Config {
    // Without apply:
    // val c = Config(); c.host = "x"; c.port = 8080; return c
    return Config().apply {
        host = "localhost"
        port = 8080
    }
}
fun main() {
    val c = makeConfig()
    println("${c.host}:${c.port}")
}

apply в цепочке

apply возвращает получателя, поэтому после него естественно вызывать другие методы в цепочке.

class Builder {
    val parts = mutableListOf<String>()
}
fun main() {
    val result = Builder().apply {
        parts.add("hello")
        parts.add("world")
    }.parts.joinToString(" ")
    println(result) // hello world
}

Основы with

with(receiver) { ... } выполняет блок, где this = получатель, и возвращает результат лямбды (а НЕ получателя). Это полезно, когда Вам нужно вычислить производное значение.

class Rect(val w: Int, val h: Int)
fun main() {
    val area = with(Rect(3, 4)) {
        w * h
    }
    println(area) // 12
}

apply и with

apply возвращает получателя и идеально подходит для объектов-построителей. with возвращает результат лямбды и идеально подходит для вычислений на основе получателя.

class Box(var width: Int = 0, var height: Int = 0)
fun main() {
    val box = Box().apply { width = 10; height = 20 } // returns Box
    val area = with(box) { width * height }            // returns Int
    println("$box area=$area")
}

apply со списками

Настраивайте изменяемую коллекцию непосредственно в выражении.

fun main() {
    val list = mutableListOf<String>().apply {
        add("a")
        add("b")
        add("c")
    }
    println(list)
}

apply возвращает тот же тип

Тип результата apply всегда совпадает с типом получателя. Явно возвращать значение не нужно.

class Sb {
    private val buf = StringBuilder()
    fun append(s: String): Sb { buf.append(s); return this }
    fun build(): String = buf.toString()
}
fun main() {
    val s = Sb().apply {
        append("Hello, ")
        append("Kotlin!")
    }.build()
    println(s)
}

Повторное использование нескольких членов с with

Внутри with все члены получателя находятся в области видимости — префикс obj. не нужен.

class Person(val name: String, val age: Int)
fun main() {
    val description = with(Person("Ada", 35)) {
        "Name: $name, Age: $age, AgeNext: ${age + 1}"
    }
    println(description)
}

Вложенный apply

Можно вложить apply в другой apply для иерархической настройки. Используйте это умеренно.

class Address {
    var city: String = ""
    var zip: String = ""
}
class User {
    var name: String = ""
    var address: Address = Address()
}
fun main() {
    val u = User().apply {
        name = "Ada"
        address.apply {
            city = "Istanbul"
            zip = "34000"
        }
    }
    println("${u.name} in ${u.address.city}")
}

Когда НЕ следует использовать apply

Если Вам не нужно возвращать получателя, предпочтите обычное создание с именованными аргументами или let/run. Не используйте apply просто ради разнообразия.

class Config(val host: String, val port: Int)
fun main() {
    // Named arguments often beat builder + apply:
    val cfg = Config(host = "localhost", port = 8080)
    println("${cfg.host}:${cfg.port}")
}

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

Что возвращает apply после выполнения своего блока?

Итоги

apply выполняет блок, где this — объект-получатель, и возвращает объект-получатель — идеально подходит для настройки объектов. with выполняет блок, где this — объект-получатель, и возвращает результат лямбды — идеально подходит для получения производных значений. Если настройка проста, используйте именованные аргументы.

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

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

Урок «apply и with: настройка и возврат» бесплатный?

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

Чему я научусь в уроке «apply и with: настройка и возврат»?

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

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

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

Сколько времени занимает урок «apply и with: настройка и возврат»?

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

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

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

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

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