scala - tag - ¿Diferencia entre esto y yo en las anotaciones de tipo propio?
superponer graficas en r (2)
En varias publicaciones de Scala, veo algunas anotaciones de auto-tipo que usan "this" y otras que usan "self":
trait A { this: B => ... }
trait A { self: B => ... }
¿Hay alguna diferencia real entre usar "esto" o "uno mismo"? ¿Importa para nada el nombre que usas? ¿Es esto tan válido?
trait A { foo: B => ... }
Hay una diferencia en que this
siempre se refiere al objeto definido por la plantilla más interna.
La expresión
this
puede aparecer en la parte de declaración de una plantilla o tipo compuesto. Representa el objeto definido por la plantilla más interna o el tipo de compuesto que encierra la referencia. Si este es un tipo compuesto, el tipo dethis
es ese tipo compuesto. Si se trata de una plantilla de una definición de clase o objeto con nombre simple C , el tipo de esto es el mismo que el tipo de C.this
(Scala Ref. §6.5)
Entonces, si llamas a tu propio tipo foo
, igual podrías referirte a this
(a menos que, por supuesto, estés en una plantilla interna en cuyo caso this
se referirá al objeto definido por ella, y a menos que no lo hagas) le da el mismo nombre al tipo propio de la plantilla interna) pero obviamente no al revés.
Las tres formas son válidas y tienen el efecto de que B
se asume como el tipo de this
en la clase A
Las primeras dos variantes
trait A { self: B => ... }
trait A { foo: B => ... }
introduce self
(respectivamente, foo
) como un alias para this
en el rasgo A
Esto es útil para acceder a this
referencia desde una clase interna. Es decir, podría usar self
lugar de A.this
al acceder a this
referencia del rasgo A
de una clase anidada dentro de él. Ejemplo:
class MyFrame extends JFrame { frame =>
getContentPane().add( new JButton( "Hide" ) {
addActionListener( new ActionListener {
def actionPerformed( e: ActionEvent ) {
// this.setVisible( false ) --> shadowed by JButton!
frame.setVisible( false )
}
})
})
}
La tercera variante
trait A { this: B => ... }
no introduce un alias para this
; simplemente establece el tipo de uno mismo.