2012-03-15 50 views
2

我一直在Scala代碼中進行挖掘。它看起來像TreeMap使用以下構建器類。地圖構建器每次都從頭開始重新創建地圖?

class MapBuilder[A, B, Coll <: scala.collection.GenMap[A, B] with scala.collection.GenMapLike[A, B, Coll]](empty: Coll) 
extends Builder[(A, B), Coll] { 
    protected var elems: Coll = empty 
    def +=(x: (A, B)): this.type = { 
    elems = (elems + x).asInstanceOf[Coll] 
     // the cast is necessary because right now we cannot enforce statically that 
     // for every map of type Coll, `+` yields again a Coll. With better support 
     // for hk-types we might be able to enforce this in the future, though. 
    this 
    } 
    def clear() { elems = empty } 
    def result: Coll = elems 
} 

我不明白演員,但除此之外。例如,當兩個TreeMap s是++ - 合在一起時,實例化新的TreeMap,然後添加來自TreeMaps的所有鍵值對。由於TreeMap是不可變的,我們爲什麼不能從TreeMap之一開始,只是添加其他項目?這是因爲++適用於不可變和可變類型,所以我們需要製作一個防禦副本,並且一些集合可能有更有效的策略?

回答

1

如果這是我們的代碼:

val a = TreeMap(1->'a, 2->'b) 
val b = TreeMap(3->'c, 4->'d) 
val c = a ++ b 

然後++TreeMap定義爲:

override def ++[B1 >: B] (xs: GenTraversableOnce[(A, B1)]): TreeMap[A, B1] = 
    ((repr: TreeMap[A, B1]) /: xs.seq) (_ + _) 

所以我們先從ab到它的每個元素摺疊,以獲得最終結果。

換句話說,它似乎正在做你期望的。或者我錯過了什麼?

+0

你是對的 - 我不知道我是如何錯過的。想到更多的建設者可能是這樣寫的,所以它可以處理地圖,過濾器等。 – schmmd 2012-03-15 16:20:48

+0

正確的 - 並轉換爲不同的集合。 – schmmd 2012-03-15 16:43:51