Как получить доступ к свойству расширения внутри объекта извне класса? - PullRequest
0 голосов
/ 25 августа 2018

Пример:

class Foo {
    fun foo() = Unit
}

object Bar {
    val Foo.foo get() = Unit
}

fun Foo.bar() = Bar.foo

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

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете сделать это, но вы должны также ввести Bar в контекст как получатель вместе со ссылкой на someFoo.foo, в противном случае вы говорите, что Bar имеет свойство foo, которого нет , В его пределах (и его экземпляре) есть расширение Foo.foo. Поэтому измените свою последнюю строку с:

fun Foo.bar() = Bar.foo

до:

fun Foo.bar() = with (Bar) { foo }

что концептуально это:

fun Foo.bar() = with (Bar) { this@bar.foo }

Таким образом, мы используем with, чтобы сложить получатель Bar под Foo получателем экземпляра this@bar и получить доступ к свойству foo.

...