0Pricing
Kotlin Academy · Урок

with

Группируйте операции

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

Функция with

with — это функция области видимости, которая принимает объект как аргумент (а не как получатель вызова) и выполняет блок, используя этот объект как this. Она возвращает результат лямбды.

Базовое использование with

Передайте объект в with и обращайтесь к его членам напрямую внутри блока.

fun main() {
    val name = "Kotlin"
    val description = with(name) {
        "$this has $length characters"
    }
    println(description)
}

Группировка нескольких операций

with особенно удобна, когда нужно вызвать несколько методов или прочитать несколько свойств одного объекта. Она избавляет от необходимости повторять имя объекта.

fun main() {
    val sb = StringBuilder()
    with(sb) {
        append("Line 1\n")
        append("Line 2\n")
        append("Line 3")
    }
    println(sb)
}

with использует this

Как и run с apply, with предоставляет доступ к объекту через this, поэтому для обращения к членам объекта не нужен префикс.

data class Rectangle(val width: Int, val height: Int)

fun main() {
    val rect = Rectangle(4, 5)
    val area = with(rect) {
        width * height
    }
    println("Area: $area")
}

with возвращает результат лямбды

Значение последнего выражения в блоке становится результатом with, так же как и у run.

fun main() {
    val list = listOf(1, 2, 3, 4, 5)
    val summary = with(list) {
        "Size=$size, First=${first()}, Last=${last()}"
    }
    println(summary)
}

with и run

with(obj) { ... } и obj.run { ... } делают почти одно и то же. Различие заключается в синтаксисе:

  • run — это расширение, вызываемое для объекта, поэтому оно хорошо работает с безопасными вызовами.
  • with принимает объект как аргумент и естественно читается как «работая с этим объектом, выполните…».
fun main() {
    val s = "data"
    val a = with(s) { uppercase() }
    val b = s.run { uppercase() }
    println("$a $b")
}

with не предназначена для nullable-значений

Поскольку объект передаётся как аргумент, with плохо сочетается с оператором безопасного вызова. Для получателей, допускающих null, предпочтительнее использовать obj?.run { } или obj?.let { }.

fun main() {
    val name: String? = "Eve"
    name?.run { println("Hello $this") }
    println("with is awkward for nullables")
}

Одновременное чтение и вычисление

Распространённый шаблон — прочитать несколько свойств и вычислить один результат в одном понятном блоке.

data class Order(val items: Int, val pricePerItem: Int)

fun main() {
    val order = Order(3, 20)
    val total = with(order) {
        items * pricePerItem
    }
    println("Total: $total")
}

Построение строк с with

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

fun main() {
    val report = StringBuilder()
    with(report) {
        appendLine("Report")
        appendLine("======")
        appendLine("All good")
    }
    print(report)
}

with для коллекции

Можно вызвать несколько функций коллекции для одного списка, не повторяя его имя.

fun main() {
    val numbers = listOf(10, 20, 30)
    with(numbers) {
        println("Sum: ${sum()}")
        println("Max: ${max()}")
        println("Average: ${average()}")
    }
}

Когда использовать with

Выбирайте with, когда у вас есть объект, не равный null, и нужно выполнить над ним группу операций, при необходимости возвращая результат. Эта функция сообщает: «Я некоторое время работаю с этим объектом».

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

Как with получает свой объект?

Итоги

with группирует операции над одним объектом, не равным null, который передаётся как аргумент, предоставляет доступ к нему через this и возвращает результат лямбды. Эта функция похожа на run, но использует синтаксис с аргументом. Далее вы узнаете, как выбирать подходящую функцию области видимости для каждой ситуации.

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

Урок «with» бесплатный?

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

Чему я научусь в уроке «with»?

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

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

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

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

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

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

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

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

  1. let и run
  2. apply и also
  3. with
  4. Выбор подходящего инструмента
← Назад к Kotlin Academy