2012-06-29 9 views
21

El autor de la pregunta Exchanging type parameters with abstract types escribió un => al comienzo de sus definiciones de clase. Ejemplo:¿Qué significa => al comienzo de una definición de clase Scala?

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

¿Qué significa t =>?

Porque esto es difícil de encontrar en Google & Co, ¿alguien puede por favor darme más información de antecedentes o proporcionar un enlace, donde puedo encontrar más información sobre este lenguaje de construcción?

+1

Es un "tipo auto" o "[escrito] autorreferencia", como en http: //www.scala -lang.org/node/124 y una razón para usar http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait-subclasses (The authoritative guía es posiblemente la especificación de idioma Scala o SLS.) –

+2

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

Respuesta

15

El nombre predeterminado para la clase en sí es this. Puede reemplazarlo por t por t =>

Es útil si su clase contiene subclases y necesita acceder a la autoreferencia adjunta.

Sin t => en su ejemplo que iba a escribir algo como esto:

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

Group { type A = this.A } es un subtipo de modo this haría referencia al propio grupo especialización no a un objeto cosa. Probablemente no entiendas lo que quieres decir. Si necesita acceso a la autorreferencia que debe resolver el nombre del conflicto mediante la asignación de autorreferencia otro nombre

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

Por lo que puedo ver, hay 'self types' que pst mencionó en sus comentarios y existe el otro uso de simplemente renombrar la referencia 'this' como usted mencionó. ¿Los dos son llamados 'self types'? –

+1

después del encabezado de clase y antes del cuerpo de clase hay espacio para dos declaraciones: puede especificar un alias para esta referencia, como se demostró, y puede especificar el tipo propio como se describe en los enlaces sugeridos, o puede especificar ambos. Sin embargo, la declaración de tipo propio es bastante engorrosa y requiere que escriba un nombre. Puede usar 'this: AType =>' si desea especificar solo el tipo de self y puede escribir 'alias: AType =>' si especifica el alias y el tipo de self. Técnicamente, el tipo de uno mismo es un tipo, pero la declaración de tipo propio incluye la definición de alias – ayvango

Cuestiones relacionadas