我找到了简单的例子:
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
是什么意思?
感谢。
答案 0 :(得分:43)
with
表示该课程正在通过mixin使用特质。
Post
具有Trait IdPK
(类似于Java类可以implements
一个接口。)
答案 1 :(得分:12)
虽然这不是原始问题的直接答案,但对未来的读者可能有用。来自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
则没有。 <{1}}的真实类型是“匿名”类型,即p2
。实际上,Person with Swim
语法可用于任何类型的签名:
with
编辑(2016年10月12日): 我们发现了一个怪癖。以下内容无法编译:
def swimThemAll(ps: Seq[Person with Swim]): Unit = {
ps.foreach(_.swim)
}
意味着在词汇优先级方面, // each `x` has no swim method
def swim(xs: Seq[_ >: Person with Swim]): Unit = {
xs.foreach(_.swim)
}
急切地约束。它是with
,而不是_ >: (Person with Swim)
。