2012-06-29 10 views
21

L'autore della domanda Exchanging type parameters with abstract types ha scritto un => all'inizio delle sue definizioni di classe. Esempio:Cosa significa => all'inizio della definizione di una classe di Scala?

abstract class Thing { t => 
    type A 
    type G <: Group { type A = t.A } 
    val group: G 
} 

Cosa significa il t => significa?

Poiché questo è difficile da trovare in Google & Co, qualcuno può fornirmi maggiori informazioni di base o fornire un collegamento, dove posso trovare ulteriori informazioni su questo costrutto linguistico?

+1

Si tratta di un "tipo di auto" o "[digitato] di riferimento sé", come in http: //www.scala -lang.org/node/124 e un motivo per usare http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait-subclasses (Il più autorevole la guida è probabilmente la Specifica della lingua di Scala o SLS.) –

+2

http://stackoverflow.com/questions/4017357/difference-between-this-e-self-in-self-type-annotations, http://stackoverflow.com/ tags/scala/info (cerca "self") –

risposta

15

Il nome predefinito per la classe è this. È possibile sostituirlo con da t =>

È utile se la classe contiene sottoclassi e se è necessario accedere all'autenticazione.

Senza t => nel tuo esempio si potrebbe scrivere qualcosa di simile:

abstract class Thing { 
    type G <: Group { type A = this.A } 
} 

Group { type A = this.A } è un sottotipo così this sarebbe riferimento al gruppo di specializzazione per sé non a un oggetto cosa. Probabilmente non ottieni ciò che intendi ottenere. Se è necessario accedere a Thing auto di riferimento si dovrebbe risolvere il nome del conflitto assegnando sé un altro nome di riferimento

abstract class Thing { another_this = > 
    type G <: Group { type A = another_this.A} 
} 
+0

Per quanto posso vedere, ci sono i 'self types' che sono menzionati nei suoi commenti e c'è l'altro modo di rinominare il 'this' reference come hai detto. Entrambi sono chiamati "tipi di auto"? –

+1

dopo l'intestazione della classe e prima del corpo della classe c'è spazio per due dichiarazioni: è possibile specificare l'alias per questo riferimento, come è stato dimostrato, e si può specificare il tipo di auto come descritto nei collegamenti suggeriti, oppure è possibile specificare entrambi. Tuttavia, la dichiarazione di tipo automatico è piuttosto ingombrante e richiede di scrivere un nome. Si può usare 'this: AType =>' se si desidera specificare solo il self type e si può scrivere 'alias: AType =>' se si specifica sia l'alias che il self type. Tecnicamente il tipo di auto è un tipo, ma la dichiarazione del tipo di sé include la definizione di alias – ayvango

Problemi correlati