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.
नोट यह निर्दिष्ट नहीं है कि क्या "बाएं से दाएं" एक अव्यवस्थित नक्शे के लिए मायने रखता है।
निम्नलिखित दिखाता है क्या ++
reimplementing और 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) */
धन्यवाद। यदि आप मुझे यह भी बता सकते हैं कि (या संदर्भ जहां नियम परिभाषित किया गया है) दें, तो आपको स्वीकार्य उत्तर प्राप्त होगा। :-) –
ज्यादातर मामलों में '++' का कार्यान्वयन '+' पर निर्भर करता है, जो इसके बदले में 'अद्यतन' पर निर्भर करता है और [इस] (http://www.scala-lang.org/api/current /scala/collection/immutable/Map.html) स्केलैडोक यह कहा गया है कि 'अपडेट किया गया' नए मानों के साथ अपडेट किया गया एक नया अपरिवर्तनीय मानचित्र देता है। हाँ, मुझे पता है, एक पूर्ण प्रमाण नहीं, तो शायद आपको अभी तक इस प्रश्न को बंद नहीं करना चाहिए और बेहतर संदर्भ की प्रतीक्षा करनी चाहिए। हालांकि "जावा मैप" संदर्भ बैल $ हिट है। –