Что такое 'context receivers' и как они функционируют в Kotlin?

Context receivers позволяли объявить требуемые контекстные объекты и использовать их как неявные ресиверы. В старом экспериментальном синтаксисе это выглядело так:

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

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

Context receivers позволяли объявить требуемые контекстные объекты и использовать их как неявные ресиверы. В старом экспериментальном синтаксисе это выглядело так:

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

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

Context receivers позволяли объявить требуемые контекстные объекты и использовать их как неявные ресиверы. В старом экспериментальном синтаксисе это выглядело так:

// Исторический синтаксис context receivers
context(Logger)
fun report(message: String) {
    log(message)
}

При вызове нужный ресивер предоставляли, например, через with(logger) { report("Готово") }. Просто объявить локальную переменную типа Logger было недостаточно.

Новый механизм context parameters даёт зависимостям имена:

// Синтаксис context parameters в поддерживающей его версии Kotlin
context(logger: Logger)
fun report(message: String) {
    logger.log(message)
}

Это помогает описывать контекст выполнения и зависимости без их повторения в обычных аргументах каждого вызова. Разрешение зависит от доступных значений подходящего типа; неоднозначность является ошибкой.

Context receivers не следует представлять как актуальный универсальный механизм всех версий Kotlin. Для проекта сверяют поддержку и параметры компилятора с его версией. Документация context parameters и миграции.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку