kotlin – 在内部类的扩展函数中使用限定条件访问外部作用域

当我为它创建扩展函数时,如何从内部类访问外部作用域?

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

此代码按预期编译和执行.

当我添加以下扩展功能

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

编译失败了

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

我阅读了qualified this的文档,并简要提到了扩展功能,但没有任何示例.

是否可以从扩展功能访问外部范围?

最佳答案 一个扩展函数只能做一个非扩展乐趣ext(x:AB)可以做的事情,所以我不希望,就像
you can’t access it in Java.这是因为它编译成这样一个函数,语法只是让它看起来像一个成员.

虽然B类有一个包含对外部A实例的引用的字段,但是不能通过名称直接从代码中访问该字段.允许访问它将是violate encapsulation.

链接页面谈到“从外部范围访问”.这里的“范围”在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() = ...

没有任何外部作用域(文件作用域除外,没有这个).除非是真的

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

但是你不能写这个@A或者这个@B,因为这个函数没有在A类或B类的范围内定义.

点赞