Подтвердить что ты не робот

Scala с использованием ключевых слов

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

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?

Спасибо.

4b9b3361

Ответ 2

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

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

Это означает, что 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 - нет. Реальный тип 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.