← Назад к вопросам

Что такое run {}?

1.2 Junior🔥 181 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое run {} в языке Kotlin?

run {} — это одно из стандартных функций-расширений (scope functions) в Kotlin, предназначенных для выполнения блока кода в контексте объекта и возврата результата этого блока.

Ключевые характеристики run {}

  1. Контекстный объект (this) внутри блока: Внутри лямбды run объект доступен через ключевое слово this. Это позволяет напрямую обращаться к его свойствам и методам без дополнительных квалификаторов.
  2. Возвращаемое значение: Результатом выполнения run является результат последнего выражения в лямбде.
  3. Ненулевая безопасность: Обычно используется с безопасным вызовом ?.run, чтобы выполнить блок только если объект не равен null.

Синтаксис и основные варианты использования

// Пример 1: Базовый синтаксис run
val person = Person("Анна", 30)
val description = person.run {
    // this — это объект person
    "Имя: $name, возраст: $age"
}
println(description) // Вывод: Имя: Анна, возраст: 30

// Пример 2: Использование с безопасным вызовом (?.run)
val nullablePerson: Person? = null
val result = nullablePerson?.run {
    "Имя: $name" // Этот блок не выполнится, так как nullablePerson равен null
}
println(result) // Вывод: null

// Пример 3: run без контекстного объекта (не как extension-функция)
val computedValue = run {
    val x = 10
    val y = 20
    x + y // Результат вычисления станет возвращаемым значением run
}
println(computedValue) // Вывод: 30

Сравнение с другими scope-функциями

  • let {}: Использует it для доступа к объекту и часто применяется для null-safety сценариев. Подходит, когда нужно передать объект в цепочку вызовов.
  • apply {}: Возвращает сам объект (this), а не результат лямбды. Идеален для конфигурации объекта.
  • also {}: Аналогично apply, использует it и возвращает объект, но применяется для побочных действий, таких как логирование.
  • with {}: Не является extension-функцией, принимает объект как аргумент. Подходит для группировки операций над объектом.

Преимущества run {}:

  • Эффективен для трансформации объекта в другое значение.
  • Удобен для ограничения области видимости временных переменных.
  • Способствует читаемости кода за счет компактного контекстного блока.

Практический пример использования

class DatabaseConfig {
    var url: String = ""
    var timeout: Int = 0
    fun validate() = url.isNotEmpty() && timeout > 0
}

fun configureDatabase(): String {
    return DatabaseConfig().run {
        url = "jdbc:mysql://localhost:3306/mydb"
        timeout = 5000
        if (validate()) "Конфигурация базы данных успешно применена" 
        else "Ошибка конфигурации"
    } // Возвращается строка результата
}

Итог

run {} — это гибкий инструмент в Kotlin, который позволяет выполнять блок кода в контексте объекта, упрощая работу с его свойствами и методами, и возвращает результат вычислений. Его часто выбирают, когда нужно одновременно инициализировать объект и выполнить над ним операции, приводящие к новому значению. В сочетании с безопасными вызовами он становится мощным средством для написания лаконичного и безопасного кода, особенно при обработке потенциально нулевых значений.