Map.++
is defined as:
override def ++[B1 >: B](xs: GenTraversableOnce[(A, B1)]): immutable.Map[A, B1] =
((repr: immutable.Map[A, B1]) /: xs.seq) (_ + _)
其中repr
是當前地圖和xs.seq
讓你存儲在你傳遞給++
地圖的雙/映射的序列。
Map./:
is described as:
def /:[B](z: B)(op: (B, (A, B)) ⇒ B): B
Applies a binary operator to a start value and all elements of this
immutable map, going left to right.
Note: /: is alternate syntax for foldLeft;
z /: xs is the same as xs foldLeft z.
注意,它沒有指定什麼 「從左至右」 是指無序地圖。
下面舉例說明通過重新實現++
與調試增強它println
語句在幕後發生了什麼:
val m1 = Map(1 -> "A", 2 -> "B", 3 -> "C")
val m2 = Map(2 -> "X", 3 -> "Y", 4 -> "Z")
println(m1.repr)
/* Map(1 -> A, 2 -> B, 3 -> C) */
println(m1.repr.getClass.getName)
/* scala.collection.immutable.Map$Map3 */
def ++[K, V](ts: Map[K, V], xs: Map[K, V]): Map[K, V] =
(ts /: xs) {case (acc, entry) =>
println("acc = " + acc)
println("entry = " + entry)
acc + entry
}
val m3 = ++(m1, m2)
/*
acc = Map(1 -> A, 2 -> B, 3 -> C)
entry = (2,X)
acc = Map(1 -> A, 2 -> X, 3 -> C)
entry = (3,Y)
acc = Map(1 -> A, 2 -> X, 3 -> Y)
entry = (4,Z)
*/
println(m3)
/* Map(1 -> A, 2 -> X, 3 -> Y, 4 -> Z) */
謝謝。如果你也可以告訴我爲什麼(或者在定義規則的地方給出了參考),你會得到接受的答案。 :-) – 2012-07-31 15:32:32
在大多數情況下,'++'的實現依賴於'+',它依次依賴於'updated'和[this](http://www.scala-lang.org/api/current /scala/collection/immutable/Map.html)scaladoc聲明'updated'返回一個用新值更新的新的不可變映射。是的,我知道,這不是一個絕對的證據,所以你可能不應該關閉這個問題,等待更好的參考。儘管如此,「Java Map」引用仍然是公牛命中。 – 2012-07-31 16:09:14