Riferimenti auto espliciti senza tipo / differenza con ” questo ”

Comprendo l’uso di auto-riferimenti esplicitamente digitati :

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

Nel corpo, il self è un alias per this ma ha il tipo T with T2 più preciso T with T2 .

Ora, ho visto questo nel codice:

 trait T { self => ... } 

Cioè, un’auto referenza esplicita senza ulteriori informazioni sul tipo. In questa configurazione, c’è qualche situazione in cui il self non è solo un alias per this ?

È un alias per this .

Il tuo primo esempio è utile per assicurare che il tratto sia stato mischiato a un tipo appropriato e rende disponibili quei metodi.

Il secondo esempio è utile quando si hanno classi interne con conflitti di denominazione, per rendere visibile l’ambito esterno. Per esempio:

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

Quindi new AnyRef with U stampe

 inner inner outer 

“self” non è una parola chiave speciale – puoi usare “bananas =>” o qualsiasi cosa tu voglia, ma è spesso usata per convenzione.

Questo si verifica un po ‘in Swing, dove si fanno molto sulle classi interne (caselle di testo all’interno di scroll, ecc.), Che di solito hanno molti metodi con gli stessi nomi delle classi esterne.

In questo caso il self è un altro modo per dirlo.

Se ti capita di avere una class interiore, tuttavia, this all’interno della class interna sarebbe la class interiore, e il self sarebbe la class contenitore.

Questa è l’unica differenza AFAIK