Differenza tra questo e sé nelle annotazioni di auto-tipo?


134

In varie pubblicazioni sulla Scala vedo alcune annotazioni di tipo "self" che usano "this" e altre che usano "self":

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

C'è qualche vera differenza tra l'uso di "this" o "self"? Importa assolutamente quale nome usi? È altrettanto valido?

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

Risposte:


181

Tutti e tre i moduli sono validi e hanno l'effetto Bassunto come tipo di thisin class A.

Le prime due varianti

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

introdurre self(rispettivamente, foo) come alias per thisin tratto A. Ciò è utile per accedere al thisriferimento da una classe interna. Vale a dire che è possibile utilizzare selfinvece A.thisquando si accede al thisriferimento del tratto Ada una classe nidificata al suo interno. Esempio:

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

La terza variante,

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

non introduce un alias per this; imposta solo il tipo di sé.


Il modo in cui guardo il tipo di sé è che la caratteristica si è dichiarata prendere un certo tipo e restituire il blocco di codice, ad esempio foo: B => {...}. Ora quei ricci sono ovviamente omessi. È interessante vedere che puoi usare il nome dell'oggetto invece di "questo" all'interno di qualsiasi ambito nel codice [qualcosa che facciamo sempre in javascript]
Ustaman Sangat

4
@Martin Odersky È possibile aggiungere una restrizione per due o più tratti, qualcosa del genere trait A { self: B, C => ... }?
Dmitry Bespalov,

13
@DmitryBespalov: Sì, è possibile utilizzare la withparola chiave nell'annotazione di auto-digitazione. Ad esempiotrait A { self: B with C => ... }
Dave,

tra l'altro puoi anche fare _: B =>il caso non alias per semplicità
Creos,

17

C'è una differenza nel fatto che thissi riferisce sempre all'oggetto definito dal modello più interno.

L'espressione thispuò apparire nella parte dell'istruzione di un modello o tipo composto. Indica l'oggetto definito dal modello più interno o dal tipo composto che racchiude il riferimento. Se si tratta di un tipo composto, il tipo di thisè quel tipo composto. Se si tratta di un modello di definizione di una classe o di un oggetto con il semplice nome C , il tipo di questo è lo stesso come il tipo di C . this. (Rif. Scala §6.5)

Quindi, se chiami il tuo auto-tipo foo, potresti ancora riferirti ad esso come this(a meno che, naturalmente, non ti trovi in ​​un modello interno nel qual caso thissi riferirà all'oggetto da esso definito - e a meno che tu non dia l'interiore il modello digita da solo lo stesso nome) ma ovviamente non viceversa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.