2011-07-20 9 views
29

me pareció simple ejemplo:Scala con el uso de palabras clave

class Post extends LongKeyedMapper[Post] with IdPK { 
    def getSingleton = Post 

    object title extends MappedText(this) 
    object text extends MappedText(this) 
    object date extends MappedDate(this) 
} 


object Post extends Post with LongKeyedMetaMapper[Post] { 
    def getPosts(startAt: Int, count: Int) = { 
     Post.findAll(OrderBy(Post.date, Descending), StartAt(startAt), MaxRows(count)) 
    } 

    def getPostsCount = Post.count 
} 

¿Qué significa with IdPK?

Gracias.

Respuesta

37

with significa que la clase está utilizando un rasgo a través de mixin.

Post tiene el Rasgo IdPK (similar a una clase de Java puede implements una interfaz).

Ver también A Tour of Scala: Mixin Class Composition

+0

Gracias, me olvidé de los rasgos en scala. –

+0

¿Cuál sería el verbo UML para una relación "con"? "tiene", "incluye" ... – Ricardo

8

Si bien esto no es una respuesta directa a la pregunta original, puede ser útil para futuros lectores. De Wikipedia:

Scala permite mezclar un rasgo (creando un tipo anónimo) al crear una nueva instancia de una clase.

Esto significa que with se puede utilizar fuera de la línea superior de una definición de clase. Ejemplo:

trait Swim { 
    def swim = println("Swimming!") 
} 

class Person 

val p1 = new Person // A Person who can't swim 
val p2 = new Person with Swim // A Person who can swim 

p2 aquí tiene el método swim a su disposición, mientras que p1 no. El real tipo de p2 es un "anónimo", es decir, Person with Swim. De hecho, with sintaxis puede ser utilizado en cualquier tipo de firma:

def swimThemAll(ps: Seq[Person with Swim]): Unit = { 
    ps.foreach(_.swim) 
} 

EDITAR (2016 Oct 12): Hemos descubierto una peculiaridad. Lo siguiente no se compilará:

// each `x` has no swim method 
def swim(xs: Seq[_ >: Person with Swim]): Unit = { 
    xs.foreach(_.swim) 
} 

Lo que significa que, en términos de prioridad léxica, with se une con avidez. Es _ >: (Person with Swim), no (_ >: Person) with Swim.

+0

hey @fosskers, estoy buscando una respuesta en línea pero no pude encontrarla, y en mi búsqueda terminé aquí, si tengo 'Seq [_>: Persona con Swim] ', ¿significa esto" cualquier supertipo de tipo 'Persona con Natación" o "cualquier supertipo de tipo' Persona', con 'Nadar' mezclado en "? Para ser honesto, ninguno tiene demasiado sentido y nunca tuve la necesidad de usarlo, pero lo encontré en otro código. – slouc

+0

@slouc Actualicé mi publicación para reflejar mis hallazgos. –

Cuestiones relacionadas