【发布时间】:2011-09-20 08:32:00
【问题描述】:
我正在寻找一个基本上是一个带有额外字段的集合的类。但是,我一直遇到问题,想知道实现它的最佳方法是什么。我试图遵循 Scala 书中给出的模式。例如
import scala.collection.IndexedSeqLike
import scala.collection.mutable.Builder
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable.ArrayBuffer
class FieldSequence[FT,ST](val field: FT, seq: IndexedSeq[ST] = Vector())
extends IndexedSeq[ST] with IndexedSeqLike[ST,FieldSequence[FT,ST]] {
def apply(index: Int): ST = return seq(index)
def length = seq.length
override def newBuilder: Builder[ST,FieldSequence[FT,ST]]
= FieldSequence.newBuilder[FT,ST](field)
}
object FieldSequence {
def fromSeq[FT,ST](field: FT)(buf: IndexedSeq[ST])
= new FieldSequence(field, buf)
def newBuilder[FT,ST](field: FT): Builder[ST,FieldSequence[FT,ST]]
= new ArrayBuffer mapResult(fromSeq(field))
implicit def canBuildFrom[FT,ST]:
CanBuildFrom[FieldSequence[FT,ST], ST, FieldSequence[FT,ST]] =
new CanBuildFrom[FieldSequence[FT,ST], ST, FieldSequence[FT,ST]] {
def apply(): Builder[ST,FieldSequence[FT,ST]]
= newBuilder[FT,ST]( _ ) // What goes here?
def apply(from: FieldSequence[FT,ST]): Builder[ST,FieldSequence[FT,ST]]
= from.newBuilder
}
}
问题是隐式定义的 CanBuildFrom 需要一个不带参数的 apply 方法。但是在这些情况下,这种方法是没有意义的,因为需要一个字段(FT 类型)来构造一个 FieldSequence。事实上,仅仅从 ST 类型的序列构造 FieldSequence 应该是不可能的。我能做的最好的事情是在这里抛出异常吗?
【问题讨论】: