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 — локальная установка не требуется.
Все уроки этого курса
- apply и with: настройка и возврат
- let и run: преобразование и область видимости
- also: побочные эффекты без изменения получателя
- Как выбрать подходящую функцию области видимости