KT Kotlin  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Лямбды и функции высшего порядка

Тест про лямбды и функции высшего порядка сосредоточен на функциональных типах, завершающей лямбде, получателе и захвате переменных. Нужно точно видеть сигнатуру и учитывать, что замыкание хранит доступ к переменной, а не снимок её значения.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 1 из 20
Какой редкий случай способен сломать наивную трактовку «Функция как значение»?
Вопрос 2 из 20
Для «Лямбда после круглых скобок» предлагают правку: Использовать trailing lambda, когда она представляет исходное действие вызова; параметры конфигурации оставлять явно названными. Какой компромисс нельзя пропустить?
Вопрос 3 из 20
Какой результат даст пример «Лямбда с receiver» без изменения окружения?
KotlinЛямбда с получателем · Лямбда с receiver
// Проследите фактическое выполнение без изменения кода.
fun build(block: StringBuilder.() -> Unit): String =
    StringBuilder().apply(block).toString()

fun main() = println(build { append("K"); append(length) })
Вопрос 4 из 20
Какой принцип лежит в основе поведения «Общее состояние замыканий»?
KotlinЗахват значений · Общее состояние замыканий
// На ревью требуется объяснить причину поведения.
fun counters(): List<() -> Int> {
    var n = 0
    return List(3) { { ++n } }
}
fun main() = println(counters().map { it() })
Вопрос 5 из 20
Какая строка будет напечатана?
KotlinЗавершающая лямбда · Лямбда после круглых скобок
// Проследите фактическое выполнение без изменения кода.
fun collect(prefix: String, block: (Int) -> String): String =
    (1..3).joinToString(prefix = prefix, transform = block)

fun main() = println(collect("[") { n -> "$n]" })
Вопрос 6 из 20
На какой контракт языка или библиотеки опирается «Лямбда с receiver»?
KotlinЛямбда с получателем · Лямбда с receiver
// На ревью требуется объяснить причину поведения.
fun build(block: StringBuilder.() -> Unit): String =
    StringBuilder().apply(block).toString()

fun main() = println(build { append("K"); append(length) })
Вопрос 7 из 20
Что стоит исправить в «Общее состояние замыканий» перед слиянием?
KotlinЗахват значений · Общее состояние замыканий
// Сохраните назначение фрагмента, но укрепите его контракт.
fun counters(): List<() -> Int> {
    var n = 0
    return List(3) { { ++n } }
}
fun main() = println(counters().map { it() })
Вопрос 8 из 20
Какой побочный эффект существеннее остальных после правки «Функция как значение»: Называть функциональный параметр по роли и при сложном контракте заменить голую сигнатуру на `fun interface`?
Вопрос 9 из 20
Какую правку выбрать, чтобы сохранить назначение «Лямбда с receiver» и убрать хрупкость?
KotlinЛямбда с получателем · Лямбда с receiver
// Сохраните назначение фрагмента, но укрепите его контракт.
fun build(block: StringBuilder.() -> Unit): String =
    StringBuilder().apply(block).toString()

fun main() = println(build { append("K"); append(length) })
Вопрос 10 из 20
На каком входе или состоянии граница «Общее состояние замыканий» становится заметной?
Вопрос 11 из 20
Что появится в выводе примера «Функция как значение»?
KotlinФункциональные типы · Функция как значение
// Проследите фактическое выполнение без изменения кода.
fun applyTwice(x: Int, f: (Int) -> Int) = f(f(x))
fun main() = println(applyTwice(3) { it + 2 })
Вопрос 12 из 20
Какое правило определяет поведение фрагмента «Лямбда после круглых скобок»?
KotlinЗавершающая лямбда · Лямбда после круглых скобок
// На ревью требуется объяснить причину поведения.
fun collect(prefix: String, block: (Int) -> String): String =
    (1..3).joinToString(prefix = prefix, transform = block)

fun main() = println(collect("[") { n -> "$n]" })
Вопрос 13 из 20
Решение для «Общее состояние замыканий»: Сделать состояние явным объектом или создать отдельную локальную переменную на итерацию, если счётчики должны быть независимыми. Что в нём остаётся не бесплатным?
Вопрос 14 из 20
Что в семантике Kotlin или используемого API объясняет «Функция как значение»?
KotlinФункциональные типы · Функция как значение
// На ревью требуется объяснить причину поведения.
fun applyTwice(x: Int, f: (Int) -> Int) = f(f(x))
fun main() = println(applyTwice(3) { it + 2 })
Вопрос 15 из 20
Что изменить в «Лямбда после круглых скобок», чтобы скрытое допущение стало явным контрактом?
KotlinЗавершающая лямбда · Лямбда после круглых скобок
// Сохраните назначение фрагмента, но укрепите его контракт.
fun collect(prefix: String, block: (Int) -> String): String =
    (1..3).joinToString(prefix = prefix, transform = block)

fun main() = println(collect("[") { n -> "$n]" })
Вопрос 16 из 20
Что проверить отдельно, чтобы не принять «Лямбда с receiver» за универсальное правило?
Вопрос 17 из 20
Как укрепить «Функция как значение», не переписывая соседние модули?
KotlinФункциональные типы · Функция как значение
// Сохраните назначение фрагмента, но укрепите его контракт.
fun applyTwice(x: Int, f: (Int) -> Int) = f(f(x))
fun main() = println(applyTwice(3) { it + 2 })
Вопрос 18 из 20
Какой сценарий выявит скрытое ограничение «Лямбда после круглых скобок»?
Вопрос 19 из 20
В «Лямбда с receiver» выбрали решение: Ограничивать receiver узким builder-интерфейсом, чтобы DSL не открывал лишние изменяющие операции. Какова его реальная цена?
Вопрос 20 из 20
Что выведет фрагмент «Общее состояние замыканий»?
KotlinЗахват значений · Общее состояние замыканий
// Проследите фактическое выполнение без изменения кода.
fun counters(): List<() -> Int> {
    var n = 0
    return List(3) { { ++n } }
}
fun main() = println(counters().map { it() })

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

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

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

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