2009-03-25 9 views
9

Ich habe diese Syntax nur Map für eine scala fand heraus (hier in wandelbar Form verwendet)Scala Map: geheimnisvoller syntaktischer Zucker?

val m = scala.collection.mutable.Map[String, Int]() 
m("Hello") = 5 
println(m) //PRINTS Map(Hello -> 5) 

Jetzt bin ich nicht sicher, ob dies in der Sprache gebaut syntaktischen Zucker ist, oder ob etwas Grundlegenderes passiert hier mit der Tatsache, dass eine Karte eine PartialFunction verlängert. Könnte jemand erklären?

Antwort

14

Wenn Sie meinen, (es wäre schön, wenn man noch deutlicher sein könnte)

m("Hello") = 5 

, die syntaktischen Zucker bestimmt ist für

m.update("Hello", 5) 

unabhängig davon, was m. Dies ist analog zu

m("Hello") 

der für syntaktischen Zucker

m.apply("Hello") 

ist (ich lese gerade "Programming in Scala".)

+0

Können Sie mich auf die Seite in Programmierung in Scala zeigen; Wenn ich nicht blind bin, kann ich es nicht finden. Ich bin wirklich nicht überzeugt, dass dies überhaupt syntaktischer Zucker ist. –

+0

Können Sie angeben, wo die "update" -Methode in der Hierarchie ist? Ich kann es nicht einmal finden! –

+3

Es ist auf Seite 40. – starblue

5

@starblue korrekt ist. Beachten Sie, dass Sie mit update auch ziemlich kreative Dinge tun können, z. B. Werte andere als das, was zugeordnet wurde. Zum Beispiel:

val a = Map(1 -> "one")  // an immutable Map[Int, String] 
val b = a(2) = "two" 
val c = b(5) = "five" 
val d = c(1) = "uno" 

d == Map(1 -> "uno", 2 -> "two", 5 -> "five")  // => true 

Dies funktioniert, weil immutable.Map#update eine Instanz der neuen Map zurückgibt. Es sieht etwas komisch für das C-geschulte Auge aus, aber man gewöhnt sich daran.

+3

Also "m (K) = V" ist syntaktischer Zucker für m.update (K, V). Wie kann man sagen, dass dies der Fall ist? Auf welche anderen Methoden kann syntaktischer Zucker angewendet werden? Und ich kann nicht einmal ein Methoden-Update auf Map (oder einer seiner Erben) im Scaladoc sehen. Woher sollte ich überhaupt wissen, dass Map eine solche Methode hatte? –