Scala与关键字的用法

den*_*dym 40 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
}
Run Code Online (Sandbox Code Playgroud)

这是什么意思with IdPK

谢谢.

Jon*_*nas 46

with意味着该课程通过mixin使用Trait .

Post具有Trait IdPK(类似于Java类可以implements是一个接口).

另见Scala之旅:Mixin类组合


Col*_*ury 14

虽然这不是原始问题的直接答案,但它可能对未来的读者有用.来自维基百科:

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
Run Code Online (Sandbox Code Playgroud)

p2这里有swim可用的方法,而p1没有.在真正的类型p2是"匿名"之一,即Person with Swim.实际上,with语法可以用在任何类型的签名中:

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

编辑(2016年10月12日): 我们发现了一个怪癖.以下内容无法编译:

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

意味着在词汇优先方面,with急切地束缚.这_ >: (Person with Swim),不是(_ >: Person) with Swim.