Kotlin: потеря «этого» контекста в обработчике таймерных задач - PullRequest
1 голос
/ 12 апреля 2020

У меня есть этот пример кода, который я использую для тестирования источника света в моем проекте, написанном в Kotlin.

fun Light.test() {
    val open = this.isOpen()
    this.setOpen(!open)
    val that = this
    Timer().schedule(500) {
        that.setOpen(open)
    }
}

Видите, с Timer().schedule(500) в лямбде я, кажется, потерять область действия this, и this станет самим timertask вместо объекта Light.

Я нашел решение, используя старую добрую моду val that = this, извлеченную из 2010 Javascript, но мне интересно, есть ли более элегантный способ сделать это в Kotlin.

Спасибо вы за вашу помощь

1 Ответ

2 голосов
/ 12 апреля 2020

Существует специальный синтаксис, позволяющий получить доступ к предпочтительному this в любом контексте. В вашем случае вы можете использовать:

fun Light.test() {
    val open = isOpen()
    setOpen(!open)
    Timer().schedule(500) {
        this@test.setOpen(open)
    }
}

...