0Pricing
Kotlin Academy · Урок

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

Применяйте let для преобразований с безопасной обработкой null, а run — для локальных вычислений.

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

let и run

let использует it как объект-получатель, а run — this. Обе функции возвращают последнее выражение лямбды. Выбирайте между ними в зависимости от того, предпочитаете ли Вы явные ссылки.

Основы let

let передаёт объект-получатель в лямбду как it. Это удобно для преобразования значения или ограничения области видимости переменной.

fun main() {
    val length = "Kotlin".let { it.length }
    println(length) // 6
}

let с nullable-значением

Классический приём: obj?.let { ... } выполняет блок только тогда, когда obj не равен null.

fun main() {
    val name: String? = "Ada"
    val upper = name?.let { it.uppercase() } ?: "(unknown)"
    println(upper) // ADA
}

let для преобразования

Используйте let, чтобы преобразовать значение и сохранить читаемость цепочки вызовов.

fun main() {
    val numStr = "42"
    val doubled = numStr.let { it.toInt() }.let { it * 2 }
    println(doubled) // 84
}

let для ограничения области видимости

Ограничивайте видимость переменной небольшим блоком — это простой способ избежать загрязнения пространства имён.

fun main() {
    val username = readUserConfig().let { config ->
        config.uppercase()
    }
    println(username)
}
fun readUserConfig() = "ada"

Основы run

run работает подобно let, но использует this вместо it. Это удобно, когда нужно вызвать несколько членов объекта-получателя.

class Rect(val w: Int, val h: Int) {
    fun area() = w * h
    fun perimeter() = 2 * (w + h)
}
fun main() {
    val description = Rect(3, 4).run {
        "area=${area()}, perimeter=${perimeter()}"
    }
    println(description)
}

run как самостоятельный блок

run { ... } (без объекта-получателя) выполняет блок и возвращает его результат — это удобно для группировки вычислений.

fun main() {
    val result = run {
        val a = 10
        val b = 20
        a + b
    }
    println(result) // 30
}

let и run: стиль обращения к объекту-получателю

Если тело лямбды обращается ко многим членам объекта-получателя, run избавляет от it.. Если объект-получатель используется всего один или два раза, let выглядит вполне понятно.

class User(val name: String, val email: String, val age: Int)
fun main() {
    val user = User("Ada", "ada@x.io", 35)
    // run: this-style
    val s1 = user.run { "$name <$email> age $age" }
    // let: it-style
    val s2 = user.let { "${it.name} <${it.email}> age ${it.age}" }
    println(s1); println(s2)
}

Объединение let и Elvis

Сочетание ?.let { ... } и ?: — мощный шаблон безопасной для null цепочки вызовов.

fun main() {
    val raw: String? = "  hello  "
    val cleaned = raw?.let { it.trim().uppercase() } ?: "(empty)"
    println(cleaned) // HELLO
}

run с настройкой и результатом

Объединяйте настройку (через this) и возвращаемое значение в одном блоке.

class Connection {
    var host: String = ""
    fun connect() = "connected to $host"
}
fun main() {
    val status = Connection().run {
        host = "localhost"
        connect()
    }
    println(status)
}

Антишаблон: чрезмерное использование let

Не оборачивайте простые проверки на null в let, если if понятнее. Используйте функции для работы с областью видимости только там, где они действительно помогают.

fun main() {
    val name: String? = "Ada"
    // OK
    name?.let { println(it.length) }
    // Equivalent and clearer for trivial cases:
    if (name != null) println(name.length)
}

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

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

Итоги

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

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

Урок «let и run: преобразование и область видимости» бесплатный?

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

Чему я научусь в уроке «let и run: преобразование и область видимости»?

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

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

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

Сколько времени занимает урок «let и run: преобразование и область видимости»?

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

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

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

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

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