2010-10-25 4 views
117

diversa bibliografía Scala veo algunas anotaciones de tipo auto utilizando "este" y otras personas usando "auto":¿Diferencia entre esto y yo en las anotaciones de tipo propio? En

trait A { this: B => ... } 
trait A { self: B => ... } 

¿Hay alguna diferencia real entre el uso de "esto" o "sí"? ¿Importa para nada el nombre que usas? ¿Es esto tan válido?

trait A { foo: B => ... } 

Respuesta

156

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 => ... } 

introducen self (respectivamente, foo) como un alias para this en rasgo A. Esto es útil para acceder a la referencia this de una clase interna. Es decir. luego puede usar self en lugar de A.this al acceder a la referencia this 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.

+0

La forma en que veo el tipo de autoestima es que el rasgo se declaró tomando cierto tipo y devolviendo el bloque de código, p. foo: B => {...}. Ahora esos curlies son, por supuesto, omitidos. Es interesante ver que puedes usar el nombre del objeto en lugar de "esto" dentro de cualquier ámbito del código aunque [algo que hacemos todo el tiempo en javascript] –

+4

@Martin Odersky ¿Es posible agregar restricciones para dos o más rasgos, algo así como 'rasgo A {self: B, C => ...}'? –

+13

@DmitryBespalov: Sí, puede usar la palabra clave 'with' en la anotación de auto-tipado. Por ejemplo 'rasgo A {self: B con C => ...}' – Dave

16

Hay una diferencia en que this siempre se refiere al objeto definido por la plantilla interior.

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. Apartado 6.5)

Por lo tanto, si se llama a su auto-tipo foo, que podría todavía se refieren a ella como this (a menos que, por supuesto, usted está en una plantilla interior en cuyo caso se referirá this al objeto definido por él, y a menos que no le dé el mismo nombre al tipo propio de la plantilla interna), pero obviamente no al revés.

Cuestiones relacionadas