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
thispuede 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 dethises 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.