Доступ к внешней области с квалифицированным this в функциях расширения для внутренних классов - PullRequest
0 голосов
/ 06 февраля 2019

Как я могу получить доступ к внешней области видимости из внутреннего класса, когда создаю для него функцию расширения?

Пример

class A {
    inner class B {
        fun own() = this@A
    }
}

Этот код компилируется и выполняется так, как предполагается.

Когда я добавляю следующую функцию расширения

fun A.B.ext() = this@A

Компиляция завершается неудачно с

Error:(7, 22) Kotlin: Unresolved reference: @A

Я прочитал документацию для , уточнил это и краткоупоминает функции расширения, но без какого-либо примера.

Возможно ли получить доступ к внешней области действия из функций расширения?

1 Ответ

0 голосов
/ 06 февраля 2019

Функция расширения может делать только то, что может делать не-расширение fun ext(x: A.B), поэтому я ожидаю, что нет, точно так же, как , вы не можете получить к ней доступ в Java .Это потому, что он компилируется в такую ​​функцию, синтаксис просто делает его похожим на член.

Хотя класс B имеет поле, содержащее ссылку на внешний экземпляр A, это поле не можетбыть доступным непосредственно из кода по имени.Разрешение доступа к нему будет нарушать инкапсуляцию .

На связанной странице говорится о «доступе [ing] this из внешней области».«Scope» здесь используется в смысле https://en.wikipedia.org/wiki/Scope_(computer_science),, поэтому в примере у вас есть области действия, где в комментариях говорится «неявная метка»

class A { // outer scope 1
    inner class B { // outer scope 2
        fun Int.foo() { // function scope
        }
    }
}

, а

fun A.B.ext() = ...

не имеет внешних областей (кроме области видимости файла, которая не имеет this).Если это действительно

class C {
    fun A.B.ext() = // can use this@C
}

, но вы не можете написать this@A или, если на то пошло, this@B, поскольку функция не определена в области class A или class B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...