Как ссылаться на обратный вызов реализации внутри "run" или "apply" в Kotlin - PullRequest
1 голос
/ 11 апреля 2019

Как получить ссылку на реализацию внутри "run" или "apply"

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.run {
            setCallback(this) // <-- How to have the MyCallback's reference here?
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

As run - это функция, которая принимает лямбду с получателем ( kotlin reference ) в блоке, который присваивается run this, относится к получателю, который в вашем примере myObject.

Поэтому вам нужно использовать , квалифицированное это -выражение, чтобы сослаться на включающий MyClass -экземпляр. Как указано в комментариях, вы должны изменить свой код следующим образом:

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.run {
            setCallback(this@MyClass) // <-- qualified this
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}

Если вы хотите избежать меток, вам нужно заменить функцию run. Возможная альтернатива - also, которая вместо использования лямбды с получателем получает объект в качестве параметра:

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.also { obj ->
            //lambda without receiver, this refers to the enclosing instance of MyClass
            setCallback(this)
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}
0 голосов
/ 11 апреля 2019

recke96 уже указал два пути решения этой проблемы, но здесь есть другой.Просто дайте this имя вне лямбды.

class MyClass  {

    fun myMethod() {
        val myObject = MyObject()
        val callback = this // <--
        myObject.run {
            setCallback(callback)
        }
    }
    // ...
}

Или, используя let

class MyClass  {

    fun myMethod() {
        val myObject = MyObject()

        let { callback ->
            myObject.run {
                setCallback(callback)
            }
        }
    }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...