2009-03-25 19 views
9

que acaba de descubrir esta sintaxis para una scala Map (utilizado aquí en forma mutable )Scala Map: ¿azúcar sintáctico misterioso?

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

ahora no estoy seguro de si esto es sintáctica azúcar incorporado a la lengua, o si algo más fundamental está sucediendo aquí que implica el hecho de que un mapa se extiende un PartialFunction. ¿Alguien podría explicar?

Respuesta

14

Si se refiere a (sería bueno si pudiera ser más explícito)

m("Hello") = 5 

que se destina el azúcar sintáctica para

m.update("Hello", 5) 

independiente de lo que es m. Esto es análogo a

m("Hello") 

que es el azúcar sintáctica para

m.apply("Hello") 

(Sólo estoy leyendo "Programación en Scala".)

+0

¿Podría indicarme la página en Programación en Scala; a menos que sea ciego, no puedo encontrarlo. Realmente no estoy convencido de que esto sea azúcar sintáctico –

+0

¿Puedes indicar dónde está el método de "actualización" en la jerarquía? ¡Ni siquiera puedo encontrarlo! –

+3

Está en la página 40. – starblue

5

@starblue es correcta. Tenga en cuenta que también puede hacer cosas bastante creativas con update, como devolver los valores otros que los asignados. Por ejemplo:

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 

Esto funciona porque immutable.Map#update devuelve una instancia de la nueva Map. Parece un poco extraño para el ojo entrenado en C, pero te acostumbras.

+3

Entonces "m (K) = V" es azúcar sintáctica para m.update (K, V). ¿Cómo puede uno decir que este es el caso? ¿Qué otros métodos pueden tener azúcar sintáctica aplicado a ellos? Y ni siquiera puedo ver una actualización de método en Map (o cualquiera de sus heredados) en el scaladoc. ¿Cómo podría siquiera saber que Map tenía ese método? –

Cuestiones relacionadas