Scala с использованием ключевых слов - PullRequest
38 голосов
/ 20 июля 2011

Я нашел простой пример:

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
}

Что это значит with IdPK?

Спасибо.

Ответы [ 2 ]

43 голосов
/ 20 июля 2011

with означает, что класс использует Trait через mixin .

Post имеет Trait IdPK (аналогично классу Java может implements интерфейс).

См. Также Путешествие по Скала: Состав класса Mixin

13 голосов
/ 18 июля 2016

Хотя это не прямой ответ на оригинальный вопрос, он может быть полезен для будущих читателей.Из Википедии :

Scala позволяет смешивать черты (создание анонимного типа) при создании нового экземпляра класса.

Thisозначает, что with можно использовать за пределами верхней строки определения класса.Пример:

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 здесь доступен метод swim, а p1 - нет. real тип p2 является "анонимным", а именно Person with Swim.Фактически, синтаксис with может использоваться в любой сигнатуре типа:

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

EDIT (2016 Oct 12): Мы обнаружили причуду.Следующее не будет компилироваться:

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

Это означает, что с точки зрения лексического приоритета with связывается с нетерпением.Это _ >: (Person with Swim), а не (_ >: Person) with Swim.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...