2013-03-24 3 views
16

Sto lavorando attraverso il libro Scala for the Impazient di Cay Horstmann, in cui mi sono imbattuto in questo modo di aggiornare una mappa mutevole.Come funziona la sintassi di aggiornamento della mappa di Scala [map (key) = newValue]?

scala> val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) 
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 3, Alice -> 10, Cindy -> 8) 

scala> scores("Alice") // retrieve the value of type Int 
res2: Int = 10 

scala> scores("Alice") = 5 // Update the Alice value to 5 

scala> scores("Alice") 
res4: Int = 5 

Sembra scores("Alice") colpi apply in MapLike.scala. Ma questo restituisce solo il valore, non qualcosa che può essere aggiornato.

Per curiosità ho provato la stessa sintassi su una mappa immutabile, ed è stato presentato con il seguente errore,

scala> val immutableScores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) 
immutableScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3, Cindy -> 8) 

scala> immutableScores("Alice") = 5 
<console>:9: error: value update is not a member of scala.collection.immutable.Map[String,Int] 
       immutableScores("Alice") = 5 
     ^

Sulla base di questo, sto supponendo che scores("Alice") = 5 si trasforma in scores update ("Alice", 5), ma non ho idea come funziona, o come è anche possibile.

Come funziona?

+1

Credo che sia solo zucchero sintattico. Non c'è una lezione profonda di base qui per quanto ho capito. – placeybordeaux

+1

Come si può vedere, viene chiamato il metodo 'update', non il metodo' apply'. –

+0

significa immutabile ** Sola lettura ** e mutabile significa ** Lettura/Scrittura ** in modo che il problema sia stato arabizzato –

risposta

22

Questo è un esempio della sintassi apply, update.

Quando si chiama map("Something") questo chiama map.apply("Something") che a sua volta chiama get.

Quando si chiama map("Something") = "SomethingElse" questo chiama map.update("Something", "SomethingElse") che a sua volta chiama put.

Dai uno sguardo allo this per una spiegazione più completa.

-1

Il problema è che stai cercando di aggiornare la mappa immutabile. Ho avuto lo stesso messaggio di errore quando la mia mappa è stata dichiarata come

var m = new java.util.HashMap[String, Int] 

Ma quando ho sostituito la definizione da

var m = new scala.collection.mutable.HashMap[String, Int] 

il m.update lavorato.

+0

OP definisce chiaramente la mappa come mutabile. – Jason

+0

hashMap è una collezione mutabile – BDR