Ответ 1
with
означает, что класс использует Trait через mixin.
Post
имеет Trait IdPK
(аналогичный Java-классу может implements
интерфейс).
Я нашел простой пример:
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
?
Спасибо.
with
означает, что класс использует Trait через mixin.
Post
имеет Trait IdPK
(аналогичный Java-классу может implements
интерфейс).
Хотя это не прямой ответ на исходный вопрос, это может быть полезно для будущих читателей. Из 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
.