当我为它创建扩展函数时,如何从内部类访问外部作用域?
例
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类的范围内定义.