为内部类创建扩展函数时,如何从内部类访问外部范围?
示例
class A {
inner class B {
fun own() = this@A
}
}
此代码按照预期的方式编译和执行。
当我添加以下扩展功能时
fun A.B.ext() = this@A
编译失败,显示
Error:(7, 22) Kotlin: Unresolved reference: @A
我阅读了qualified this的文档,其中简要提到了扩展功能,但没有任何示例。
是否可以从扩展功能访问外部作用域?
答案 0 :(得分:1)
扩展功能只能执行非扩展fun ext(x: A.B)
可以执行的操作,因此我希望不会像you can't access it in Java那样执行。这是因为它编译为这样的函数,其语法只是使其看起来像一个成员。
虽然类B
的字段包含对外部A
实例的引用,但是不能直接从代码中按名称访问此字段。允许访问它的violate encapsulation。
链接的页面讨论“从外部范围访问this
”。这里的“作用域”在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
的范围内定义。