Вызов в контексте в 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 вызовите обе
функции по очереди.