2011-07-20 21 views
29

znalazłem prosty przykład:Scala z wykorzystaniem słów kluczowych

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 
} 

Co to znaczy with IdPK?

Dzięki.

Odpowiedz

37

with oznacza, że ​​klasa używa cechy przez mixin.

Post ma cechę IdPK (podobną do klasy Java może implements interfejs).

Zobacz także A Tour of Scala: Mixin Class Composition

+0

Dzięki, zapomniałem o cechach w scala. –

+0

Jaki byłby czasownik UML dla relacji "z"? "ma", "zawiera" ... – Ricardo

8

Choć nie jest to bezpośrednia odpowiedź na oryginalne pytanie, może to być przydatne dla przyszłych czytelników. Od Wikipedia:

Scala pozwala na połączenie cechy (tworzenie anonimowego typu) podczas tworzenia nowej instancji klasy.

Oznacza to, że with można użyć poza górną linią definicji klasy. Przykład:

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 ma tu metodę swim dostępne do niego, podczas gdy p1 nie. Typ prawdziwy z p2 jest "anonimowy", a mianowicie Person with Swim. W rzeczywistości, with składnia może być stosowany w każdym podpisaniu typu:

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

EDIT (12 października 2016): Odkryliśmy to dziwactwo. Dodaje się nie skompiluje:

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

znaczy, że pod względem leksykalnym pierwszeństwa, with wiąże się z niecierpliwością. Jest to _ >: (Person with Swim), a nie (_ >: Person) with Swim.

+0

hej @fosskers, szukam odpowiedzi online, ale nie udało mi się jej znaleźć, a podczas moich poszukiwań znalazłem się tutaj - jeśli mam "Seq [_>: Osoba z Pływaniem] ", czy to oznacza" jakikolwiek nadtyp typu "Osoba z Pływaniem" "lub" jakikolwiek nadtyp rodzaju "Osoba", z "Pływanie" zmieszanym z "? Szczerze mówiąc, nie ma zbytniego sensu i nigdy nie miałem potrzeby go używać, ale znalazłem to w innym kodzie. – slouc

+0

@souc I zaktualizowałem swój post, aby odzwierciedlić moje wnioski. –

Powiązane problemy