Różnica między tym a sobą w adnotacjach samoprzylepnych?

W różnych literaturze Scali widzę pewne autotematyczne adnotacje używając "tego", a inne używając "siebie":

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

Czy jest jakaś prawdziwa różnica między używaniem "tego" a "ja"? Czy to ma znaczenie, jakiego imienia używasz? Czy to jest tak samo ważne?

trait A { foo: B => ... }
 122
Author: Zach, 2010-10-25

2 answers

Wszystkie trzy formy są poprawne i mają ten skutek, że {[3] } przyjmuje się jako typ this w klasie A.

Dwa pierwsze warianty

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

Wprowadź self (odpowiednio, foo) jako alias dla this w trait A. Jest to przydatne do uzyskania dostępu do referencji this z wewnętrznej klasy. Można wtedy użyć self zamiast A.this podczas uzyskiwania dostępu do referencji this Cechy A z zagnieżdżonej w niej klasy. Przykład:

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

Trzeci variant,

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

Nie wprowadza aliasu dla this; po prostu ustawia Typ self.

 167
Author: Martin Odersky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 17:10:58

Jest różnica w tym, że this zawsze odnosi się do obiektu zdefiniowanego przez najbardziej wewnętrzny szablon.

Wyrażenie this może pojawić się w części instrukcji szablonu lub typu złożonego. Oznacza obiekt zdefiniowany przez najbardziej wewnętrzny szablon lub typ złożony zawierający odniesienie. Jeśli jest to typ złożony, to typ this jest tym typem złożonym. Jeśli jest to szablon definicji klasy lub obiektu o prostej nazwie C , to jest to typ taki sam jak typ C .this. (Scala Ref. §6.5)

Tak więc, jeśli wywołasz swój własny typ foo, możesz nadal odnosić się do niego jako this (chyba że, oczywiście, jesteś w wewnętrznym szablonie, w którym to przypadku this będzie odnosić się do obiektu zdefiniowanego przez niego - i chyba że nie nadasz wewnętrznej własnej nazwy szablonu), ale oczywiście nie na odwrót.

 16
Author: Debilski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 19:27:06