2015-04-01 23 views
0

我用了this answer提到的RingBuffer實現,這從IndexedSeq繼承:從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

我相信你需要有一個CanBuildFrom RingBuffer在隱式範圍內。如果你看一下在Scaladocupdated完整簽名,你會看到CanBuildFrom使用:

def updated[B >: A, That](index: Int, elem: B) 
         (implicit bf: CanBuildFrom[IndexedSeq[A], B, That]) 
         : That 

我建議您閱讀丹尼爾索布拉爾的論文中Scala 2.8 breakOut瞭解更多詳情。

一般來說,我發現從大多數集合庫類繼承是一個錯誤,或者至少比看起來更難。