Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpCxCl 149 of 299 menu
◀ ▶

Вызов в контексте в Kotlin

Объявление с context само по себе не создает объект. Компилятор ждет, что перед вызовом откроют область с конкретным значением нужного типа.

Блок context(значение) { ... } принимает экземпляр и лямбду. Пока выполняется лямбда, контекстные функции с подходящим параметром связываются с этим экземпляром.

Вызов контекстной функции вне такого блока не собирается: у компилятора нет объекта для имени из context. Ошибка появляется уже на этапе компиляции, а не во время работы программы.

Рабочий фрагмент с журналом и приветствием выглядит так - объект создают один раз, область открывают блоком, вызов делают внутри:

class Logger { fun write(text: String) { println(text) } } context(logger: Logger) fun greet(name: String) { logger.write(name) } fun main() { val logger = Logger() context(logger) { greet("ann") } }

Вложенные блоки context допустимы: внутренний может переопределить значение для своей лямбды. На практике чаще хватает одного уровня - создание объекта, блок и вызов внутри него:

fun demo() { val outer = Logger() context(outer) { greet("bob") } }

Объявите Printer с методом line и функцию showTitle с контекстом printer: Printer. В main вызовите showTitle только внутри context и выведите одну строку "menu".

Добавьте вторую функцию с тем же контекстом, которая печатает строку "done". В одном блоке context вызовите обе функции по очереди.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить