Diferença entre este e o eu nas anotações de tipo próprio?

134

Em várias publicações da Scala, vejo algumas anotações do tipo auto usando "this" e outras usando "self":

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

Existe alguma diferença real entre usar "this" ou "self"? Importa o nome que você usa? Isso é tão válido?

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

Respostas:

181

Todas as três formas são válidas e têm o efeito Bassumido como o tipo de thisclasse A.

As duas primeiras variantes

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

introduzir self(respectivamente foo) como um alias para thisna característica A. Isso é útil para acessar a thisreferência de uma classe interna. Ou seja, você poderia usar em selfvez de A.thisacessar a thisreferência do traço Ade uma classe 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 alias para this; apenas define o tipo de auto.

Martin Odersky
fonte
A maneira como vejo o tipo pessoal é que a característica se declarou como tendo um determinado tipo e retornando o bloco de código, por exemplo, foo: B => {...}. Agora, esses caracóis são obviamente omitidos. É interessante ver que você pode usar o nome do objeto em vez de "isto" dentro de qualquer espaço no código embora [algo que fazemos o tempo todo em javascript]
Ustaman Sangat
4
@ Martin Odersky É possível adicionar restrições para duas ou mais características, algo assim trait A { self: B, C => ... }?
Dmitry Bespalov
13
@DmitryBespalov: Sim, você pode usar a withpalavra - chave na anotação de digitação automática. Por exemplotrait A { self: B with C => ... }
Dave
btw você também pode fazer _: B =>para o caso não alias para a simplicidade
Creos
17

Há uma diferença em que thissempre se refere ao objeto definido pelo modelo mais interno.

A expressão thispode aparecer na parte da instrução de um modelo ou tipo de composto. Representa o objeto sendo definido pelo modelo mais interno ou pelo tipo de composto que inclui a referência. Se este é um tipo de composto, o tipo de thisé esse tipo de composto. Se é um modelo de uma definição de classe ou objeto com nome simples C , o tipo de presente é o mesmo que o tipo de C . this. (Ref. Scala §6.5)

Portanto, se você chamar seu tipo próprio foo, ainda poderá se referir a ele como this(a menos que, é claro, esteja em um modelo interno; nesse caso, thisele se referirá ao objeto definido por ele - e a menos que você não dê o interior o modelo digita o mesmo nome), mas obviamente não o contrário.

Debilski
fonte