Diferença entre este e o eu em annotations de tipo próprio?

Em várias literaturas Scala, vejo algumas annotations de tipo self usando “this” e outras usando “self”:

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

Existe alguma diferença real entre usar “isto” ou “eu”? Importa em tudo o nome que você usa? Isso é tão válido?

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

Todas as três formas são válidas e têm o efeito de que B é assumido como o tipo this na class A

As duas primeiras variantes

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

introduzir self (respectivamente, foo ) como um pseudónimo para this em traço. Isso é útil para acessar a referência this partir de uma class interna. A.this seja, você poderia usar self vez de A.this ao acessar this referência do traço A de uma class aninhada dentro dele. Exemplo:

 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 ) } }) }) } 

A terceira variante,

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

não introduz um apelido para this ; apenas define o tipo de self.

Há uma diferença em que this sempre se refere ao object definido pelo modelo mais interno.

A expressão pode aparecer na parte da instrução de um modelo ou tipo composto. Representa o object que está sendo definido pelo modelo interno ou tipo composto que contém a referência. Se este for um tipo composto, o tipo this é aquele tipo composto. Se for um modelo de uma class ou definição de object com nome simples C , o tipo disso é o mesmo que o tipo de C. this . (Scala Ref. §6.5)

Então, se você chamar seu self-type foo , você ainda pode se referir a ele como this (a menos que, é claro, você esteja em um modelo interno, caso contrário, this se referirá ao object definido por ele – e a menos que você não dê ao self-type do template interno o mesmo nome), mas obviamente não o contrário.