Scala与关键字的用法

时间:2011-07-20 11:59:58

标签: 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是什么意思?

感谢。

2 个答案:

答案 0 :(得分:43)

with表示该课程正在通过mixin使用特质。

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

另见A Tour of Scala: Mixin Class Composition

答案 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)