Проверка выполнения assert при работе со scope‑функциями

Условие applied == letted ложно: apply возвращает исходного Student с фамилией Ivanov, а let возвращает нового Student с фамилией Petrov. При включённых JVM assertions будет AssertionError.

Короткий ответ

Что ответить на собеседовании

Условие applied == letted ложно: apply возвращает исходного Student с фамилией Ivanov, а let возвращает нового Student с фамилией Petrov. При включённых JVM assertions будет AssertionError.

Подробный разбор

Ответ с пояснениями

Условие

Нужно определить, будет ли выполнен assert в следующем фрагменте кода. Обратите внимание на различия между использованием apply и let.

data class Student(val firstName: String, val secondName: String)

fun main() {
    val pupil = Student("Ivan", "Ivanov")

    val newSurname = "Petrov"
    val applied = pupil.apply { Student(firstName, newSurname) }
    val letted = pupil.let { Student(it.firstName, newSurname) }

    assert(applied == letted)
}

Ответ

Условие applied == letted ложно: apply возвращает исходного Student с фамилией Ivanov, а let возвращает нового Student с фамилией Petrov. При включённых JVM assertions будет AssertionError.

Объект, созданный внутри apply, не присваивается pupil и отбрасывается. Свойства исходного data class объявлены val, но даже с var само создание другого объекта их бы не изменило. let возвращает результат своей лямбды. На JVM стандартный assert проверяет условие только при включённом соответствующем режиме, обычно через -ea; без него исключения не будет.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее