我正在使用this answer中提到的RingBuffer实现,它继承自IndexedSeq:
class RingBuffer[A](val index: Int, val data: IndexedSeq[A]) extends IndexedSeq[A] {
def shiftLeft = new RingBuffer((index + 1) % data.size, data)
def shiftRight = new RingBuffer((index + data.size - 1) % data.size, data)
def length = data.length
def apply(i: Int) = data((index + i) % data.size)
}
我希望能够做到的是:
var rb = new RingBuffer(0, IndexedSeq(1, 2, 3))
rb = rb.updated(0, 4).shiftLeft
...但更新后返回一个IndexedSeq。
我应该覆盖RingBuffer实现中的更新吗?或者我应该采取不同的方法吗?
答案 0 :(得分:0)
我相信你需要在隐式范围内拥有一个CanBuildFrom的RingBuffer。如果您查看Scaladoc中updated
的完整签名,您会看到CanBuildFrom的使用位置:
def updated[B >: A, That](index: Int, elem: B)
(implicit bf: CanBuildFrom[IndexedSeq[A], B, That])
: That
我建议在Scala 2.8 breakOut阅读Daniel Sobral的论文了解更多细节。
一般来说,我发现继承大多数集合库类是一个错误,或者至少比它看起来要困难得多。