Параметр контекста в Kotlin
Контекстный параметр по форме похож на обычный
аргумент, но не попадает в скобки вызова. Имя
из скобок context становится локальной
переменной в теле функции с типом, указанным
после двоеточия.
Класс Vault хранит пары ключ-значение
в изменяемой карте. Функция deposit
принимает только ключ и значение, а обращение
к хранилищу идет через имя vault из
контекста:
class Vault {
private val data = mutableMapOf<String, Int>()
fun put(key: String, value: Int) {
data[key] = value
}
fun total(): Int = data.values.sum()
}
context(vault: Vault)
fun deposit(key: String, amount: Int) {
vault.put(key, amount)
}
Тот же идентификатор можно комбинировать с
обычными параметрами и локальными val.
Функция depositTwice дважды вызывает
метод контекстного объекта с разными ключами:
context(vault: Vault)
fun depositTwice(base: String, step: Int) {
vault.put(base, step)
vault.put(base + "_extra", step * 2)
}
fun main() {
val vault = Vault()
context(vault) {
depositTwice("fee", 5)
println(vault.total())
}
}
Объявите класс Counter с методом
add и свойством value.
Сделайте функцию tick с контекстом
counter: Counter, которая увеличивает
счетчик на 1. В main выведите
значение после трех вызовов внутри одного блока
context.
Добавьте функцию resetIfNegative с тем
же контекстом: при отрицательном value
сбросьте счетчик в ноль через метод класса.
Проверьте на счетчике, который сначала ушел
ниже нуля.