Условие applied == letted ложно: apply возвращает исходного Student с фамилией Ivanov, а let возвращает нового Student с фамилией Petrov. При включённых JVM assertions будет AssertionError.
Проверка выполнения assert при работе со scope‑функциями
Условие 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.