KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Области видимости и scope-функции

let, run, apply и also здесь сравниваются по получателю, возвращаемому значению и роли в цепочке, а не по вкусовым предпочтениям. Вопросы помогают увидеть, когда scope-функция делает код яснее, а когда лишь прячет изменение состояния.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Какой результат даст код «Последовательное преобразование let»?
KotlinПреобразование через let · Последовательное преобразование let
// Проследите фактическое выполнение без изменения кода.
fun main() {
    val length = " Kotlin ".let { it.trim() }.let { it.length }
    println(length)
}
Вопрос 2 из 25
Что в семантике Kotlin или используемого API объясняет «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)
}
Вопрос 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}")
}
Вопрос 4 из 25
Какой дополнительный сценарий нужен для «Наблюдение через also»?
Вопрос 5 из 25
Что может усложниться в сопровождении после изменения «Границы цепочки scope-функций»: Дать промежуточным значениям имена, если цепочка затрудняет локализацию ошибки, и оставить тесты на каждую смысловую границу?
Вопрос 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)
}
Вопрос 7 из 25
Какой пограничный сценарий обязательно добавить к проверкам «Настройка объекта через apply»?
Вопрос 8 из 25
Решение для «Наблюдение через also»: Оставлять в `also` наблюдение, не меняющее смысл исходного конвейера; бизнес-переход выразить отдельной операцией. Что в нём остаётся не бесплатным?
Вопрос 9 из 25
Какой набор тестов выявит различия между преобразованием и побочным контролем?
KotlinТестирование и инструменты · Границы цепочки scope-функций
// Проследите фактическое выполнение без изменения кода.
fun normalize(raw: String?): String = raw
    ?.trim()
    ?.takeIf { it.isNotEmpty() }
    ?.also { require(!it.contains('/')) }
    ?: "guest"
Вопрос 10 из 25
Что в семантике Kotlin или используемого API объясняет «Последовательное преобразование let»?
KotlinПреобразование через let · Последовательное преобразование let
// На ревью требуется объяснить причину поведения.
fun main() {
    val length = " Kotlin ".let { it.trim() }.let { it.length }
    println(length)
}
Вопрос 11 из 25
В «Настройка объекта через apply» выбрали решение: Не прятать в `apply` операции, которые могут неочевидно бросить исключение или запускать внешние эффекты. Какова его реальная цена?
Вопрос 12 из 25
Какие строки будут выведены?
KotlinПобочное действие через also · Наблюдение через also
// Проследите фактическое выполнение без изменения кода.
fun main() {
    val result = listOf(3, 1, 2)
        .sorted()
        .also { println("sorted=$it") }
        .sum()
    println(result)
}
Вопрос 13 из 25
Какой принцип лежит в основе поведения «Границы цепочки scope-функций»?
KotlinТестирование и инструменты · Границы цепочки scope-функций
// На ревью требуется объяснить причину поведения.
fun normalize(raw: String?): String = raw
    ?.trim()
    ?.takeIf { it.isNotEmpty() }
    ?.also { require(!it.contains('/')) }
    ?: "guest"
Вопрос 14 из 25
Какая правка устраняет причину риска в «Последовательное преобразование let», а не только его проявление?
KotlinПреобразование через let · Последовательное преобразование let
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
    val length = " Kotlin ".let { it.trim() }.let { it.length }
    println(length)
}
Вопрос 15 из 25
Где поведение «Receiver и результат run» требует отдельной проверки?
Вопрос 16 из 25
Какой контракт снимает спор о причине поведения «Наблюдение через also»?
KotlinПобочное действие через also · Наблюдение через also
// На ревью требуется объяснить причину поведения.
fun main() {
    val result = listOf(3, 1, 2)
        .sorted()
        .also { println("sorted=$it") }
        .sum()
    println(result)
}
Вопрос 17 из 25
Какой рефакторинг делает поведение «Границы цепочки scope-функций» предсказуемее?
KotlinТестирование и инструменты · Границы цепочки scope-функций
// Сохраните назначение фрагмента, но укрепите его контракт.
fun normalize(raw: String?): String = raw
    ?.trim()
    ?.takeIf { it.isNotEmpty() }
    ?.also { require(!it.contains('/')) }
    ?: "guest"
Вопрос 18 из 25
Какой контрпример точнее всего показывает границу «Последовательное преобразование let»?
Вопрос 19 из 25
Что станет новой точкой внимания после изменения «Receiver и результат run»: Использовать `run`, когда конфигурация и вычисленный результат образуют одну короткую операцию, а не как универсальный контейнер?
Вопрос 20 из 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}")
}
Вопрос 21 из 25
Что добавить в регрессионный набор для «Границы цепочки scope-функций»?
Вопрос 22 из 25
Решение для «Последовательное преобразование let»: Не оборачивать каждую операцию в `let`; использовать его, когда он сокращает область имени или выражает преобразование. Что в нём остаётся не бесплатным?
Вопрос 23 из 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)
}
Вопрос 24 из 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}")
}
Вопрос 25 из 25
Какую точечную правку стоит принять на ревью фрагмента «Наблюдение через also»?
KotlinПобочное действие через also · Наблюдение через also
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
    val result = listOf(3, 1, 2)
        .sorted()
        .also { println("sorted=$it") }
        .sum()
    println(result)
}

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу