💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 3 из 25
Что изменить в «Настройка объекта через apply», чтобы скрытое допущение стало явным контрактом?
Kotlin Настройка через apply · Настройка объекта через apply Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
data class Request(var method: String = "GET", var path: String = "/")
fun main() {
val r = Request().apply { method = "POST"; path = "/items" }
println("${r.method} ${r.path}")
}
Не прятать в `apply` операции, которые могут неочевидно бросить исключение или запускать внешние эффекты.
Вынести участок в отдельный метод, считая верным следующее: Будет выведено `GET /`, так как изменения применяются к копии.
Обернуть операцию проверкой и не менять основной контракт: Возникнет ошибка из-за двух присваиваний внутри лямбды.
Оставить структуру прежней, документировав утверждение: Код не компилируется: apply работает только с builder-классами.
Перенести проверку в вызывающий код, исходя из того, что будет выведено `kotlin.Unit`, потому что apply возвращает результат блока.
Вопрос 4 из 25
Какой дополнительный сценарий нужен для «Наблюдение через also»?
Считать опасной границей ситуацию, где сначала `sorted=6`, затем `6`, потому что also выполняется после sum.
Добавить граничный тест на утверждение: Сначала исходный `[3, 1, 2]`, затем `6`, потому что sorted ленивый.
Проверить крайний ввод, при котором будет только список: also заменяет последующую цепочку на Unit.
Проверить, сохраняется ли контракт, когда код не компилируется: List не поддерживает also.
Изменение mutable receiver внутри `also` допустимо синтаксически и может сделать дальнейший конвейер неожиданным.
Вопрос 6 из 25
Какая правка устраняет причину риска в «Receiver и результат run», а не только его проявление?
Kotlin Вычисление через run · Receiver и результат run Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
class Config { var host = ""; var port = 0 }
fun main() {
val address = Config().run {
host = "localhost"; port = 8080
"$host:$port"
}
println(address)
}
Добавить защитную проверку перед фрагментом, поскольку код не компилируется: свойства val объекта нельзя менять в run.
Перенести проверку в вызывающий код, исходя из того, что она напечатает `:0`, поскольку присваивания видны только внутри лямбды-копии.
Оставить реализацию без изменений и закрепить тестом предположение: Возникнет ошибка из-за отсутствия явного `this`.
Спрятать участок за вспомогательной функцией, сохранив предположение: Она напечатает представление Config, потому что run возвращает receiver.
Использовать `run`, когда конфигурация и вычисленный результат образуют одну короткую операцию, а не как универсальный контейнер.
Вопрос 8 из 25
Решение для «Наблюдение через also»: Оставлять в `also` наблюдение, не меняющее смысл исходного конвейера; бизнес-переход выразить отдельной операцией. Что в нём остаётся не бесплатным?
Главная цена решения — необходимость учитывать, что сначала исходный `[3, 1, 2]`, затем `6`, потому что sorted ленивый.
Сопровождение усложнится, если окажется, что будет только список: also заменяет последующую цепочку на Unit.
Решение оправдано лишь при условии: Сначала `sorted=6`, затем `6`, потому что also выполняется после sum.
Промежуточная диагностика не разрывает цепочку, но скрытые побочные эффекты уменьшают локальную понятность.
После правки останется ограничение: Код не компилируется: List не поддерживает also.
Вопрос 12 из 25
Какие строки будут выведены?
Kotlin Побочное действие через also · Наблюдение через also Копировать
// Проследите фактическое выполнение без изменения кода.
fun main() {
val result = listOf(3, 1, 2)
.sorted()
.also { println("sorted=$it") }
.sum()
println(result)
}
Будет только список: also заменяет последующую цепочку на Unit.
Сначала исходный `[3, 1, 2]`, затем `6`, потому что sorted ленивый.
Код не компилируется: List не поддерживает also.
Сначала `sorted=6`, затем `6`, потому что also выполняется после sum.
Сначала `sorted=[1, 2, 3]`, затем `6`: `also` выполняет побочное наблюдение и возвращает исходный список.
Вопрос 16 из 25
Какой контракт снимает спор о причине поведения «Наблюдение через also»?
Kotlin Побочное действие через also · Наблюдение через also Копировать
// На ревью требуется объяснить причину поведения.
fun main() {
val result = listOf(3, 1, 2)
.sorted()
.also { println("sorted=$it") }
.sum()
println(result)
}
Семантика фрагмента приводит к тому, что сначала исходный `[3, 1, 2]`, затем `6`, потому что sorted ленивый.
Из правил языка или API следует, что сначала `sorted=6`, затем `6`, потому что also выполняется после sum.
Механика примера описывается утверждением: Будет только список: also заменяет последующую цепочку на Unit.
Причина результата в том, что код не компилируется: List не поддерживает also.
`also` передаёт объект как аргумент и возвращает его же; обычно подходит для журналирования, проверки или дополнительного действия.
Вопрос 25 из 25
Какую точечную правку стоит принять на ревью фрагмента «Наблюдение через also»?
Kotlin Побочное действие через also · Наблюдение через also Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
val result = listOf(3, 1, 2)
.sorted()
.also { println("sorted=$it") }
.sum()
println(result)
}
Оставить структуру прежней, документировав утверждение: Код не компилируется: List не поддерживает also.
Передать ответственность владельцу вызова, предполагая, что сначала исходный `[3, 1, 2]`, затем `6`, потому что sorted ленивый.
Оставить реализацию без изменений и закрепить тестом предположение: Сначала `sorted=6`, затем `6`, потому что also выполняется после sum.
Оставлять в `also` наблюдение, не меняющее смысл исходного конвейера; бизнес-переход выразить отдельной операцией.
Вынести участок в отдельный метод, считая верным следующее: Будет только список: also заменяет последующую цепочку на Unit.