varias tag superponer studio que name keywords graficas scala

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 de this 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.