2011-11-09 12 views
29

I entienden el uso para explicitly typed self-references:explícitos auto-referencias con ningún tipo/diferencia con '' esto ''

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

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

Ahora, he visto esto en código:

trait T { 
    self => 
    ... 
} 

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

Respuesta

35

Es un alias para this.

Su primer ejemplo es útil para garantizar que el rasgo se haya mezclado en un tipo apropiado y pone esos métodos a disposición.

El segundo ejemplo es útil cuando tiene clases internas con conflictos de nomenclatura, para que el ámbito 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 impresiones

inner 
inner 
outer 

"auto" no es una palabra clave especial - puede utilizar "plátanos =>" o lo que quiera, pero a menudo se utiliza por convención.

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.

+2

Buenos puntos, gracias. Así que es equivalente a la forma más larga 'U.this.name' en este caso, supongo. – Philippe

7

En ese caso self es otra forma de decir this.

Si tiene una clase interna, sin embargo, this dentro de la clase interna sería la clase interna, y self sería la clase de contenedor.

Esa es la única diferencia que yo sepa

+0

Y probablemente su propósito. – kboom

Cuestiones relacionadas