¿Cómo puedo acceder al alcance externo desde una clase interna cuando creo una función de extensión para ella?
Ejemplo
class A { inner class B { fun own() = this@A } }Este código se compila y ejecuta como se supone que debe hacerlo.
Cuando agrego la siguiente función de extensión
fun ABext() = this@ALa compilación falla con
Error:(7, 22) Kotlin: Unresolved reference: @ALeí la documentación para calificar esto y menciona brevemente las funciones de extensión, pero sin ningún ejemplo.
¿Es posible acceder al alcance externo desde las funciones de extensión?
Una función de extensión solo puede hacer cosas que no puede hacer una fun ext(x: AB) sin extensión, por lo que esperaría que no, al igual que no puede acceder a ella en Java . Esto se debe a que se compila en una función de este tipo, la sintaxis solo hace que parezca un miembro.
Si bien la clase B tiene un campo que contiene una referencia a la instancia externa A , no se puede acceder a este campo directamente desde el código por nombre. Permitir el acceso violaría la encapsulación .
La página vinculada habla de "acceder [ing] this desde un ámbito externo". "Alcance" aquí se usa en el sentido de https://en.wikipedia.org/wiki/Scope_(computer_science) , por lo que en el ejemplo tiene ámbitos donde los comentarios dicen "etiqueta implícita"
class A { // outer scope 1 inner class B { // outer scope 2 fun Int.foo() { // function scope } } }mientras
fun ABext() = ... no tiene ningún ámbito externo (excepto el ámbito del archivo, que no tiene this ). A menos que sea realmente
class C { fun ABext() = // can use this@C } pero no puede escribir this@A o this@B porque la función no está definida en el alcance de la class A o class B