【发布时间】:2015-04-10 19:23:37
【问题描述】:
假设我有以下数据结构:
case class Timestamped[CC[M] < Seq[M]](elems : CC, timestamp : String)
所以它本质上是一个带有属性的序列——一个时间戳——附加到它上面。这很好用,我可以使用语法创建新实例
val t = Timestamped(Seq(1,2,3,4),"2014-02-25")
t.elems.head // 1
t.timestamp // "2014-05-25"
语法笨拙,相反,我希望能够执行以下操作:
Timestamped(1,2,3,4)("2014-02-25")
t.head // 1
t.timestamp // "2014-05-25"
timestamped 只是 Seq 的扩展,它是 SeqLike 的实现,具有单个属性 val timestamp : String。
这似乎很容易做到;只需使用 Seq 和 mixin TimestampMixin { val timestamp : String }。但我不知道如何创建构造函数。 我的问题是:如何在伴生对象中创建一个构造函数,创建一个带有额外成员值的序列?签名如下:
object Timestamped {
def apply(elems: M*)(timestamp : String) : Seq[M] with TimestampMixin = ???
}
您会发现这并不简单;集合使用Builders 来实例化自己,所以我不能简单地调用构造函数来覆盖一些vals。
【问题讨论】:
标签: scala