Autorreferencias explícitas sin tipo / diferencia con ” esto ”

Entiendo el uso de auto-referencias explícitamente tipadas :

trait T { self : T2 => ... } 

En el cuerpo, el self es un alias para this pero tiene el tipo más preciso T with T2 .

Ahora, he visto esto en código:

 trait T { self => ... } 

Es decir, una autorreferencia explícita sin información de tipo adicional. En esta configuración, ¿hay alguna situación en la que el self no sea solo un alias para this ?

Es un alias para this .

Su primer ejemplo es útil para garantizar que el rasgo se haya mezclado en un tipo apropiado y los haga disponibles.

El segundo ejemplo es útil cuando tienes clases internas con conflictos de nombres para hacer que el scope externo sea visible. Por ejemplo:

 trait U { self => val name = "outer" val b = new AnyRef { val name = "inner" println(name) println(this.name) println(self.name) } } 

Entonces new AnyRef with U imprime

 inner inner outer 

“sí mismo” no es una palabra clave especial: puede usar “bananas =>” o lo que quiera, pero a menudo lo usan las convenciones.

Esto surge bastante en Swing, donde se gana mucho en clases internas (cuadros de texto dentro de scrollpanes, etc.), que generalmente tienen muchos métodos con los mismos nombres que las clases externas.

En ese caso, el self es otra forma de decir this .

Sin embargo, si tienes una clase interna, this dentro de la clase interna sería la clase interna, y el self sería la clase contenedor.

Esa es la única diferencia AFAIK