Как работает синтаксис Scala mutable Map update [map (key) = newValue]?
Я работаю через Cay Horstmann Scala для книги Impatient, где я сталкивался с этим способом обновления изменчивой карты.
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
Похоже на scores("Alice")
попадание apply
в MapLike.scala
. Но это возвращает значение, а не то, что может быть обновлено.
Из любопытства я попробовал такой же синтаксис на неизменяемой карте и был представлен со следующей ошибкой:
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
^
Исходя из этого, я предполагаю, что scores("Alice") = 5
преобразуется в scores update ("Alice", 5)
, но я не знаю, как это работает или как это возможно.
Как это работает?
Ответы
Ответ 1
Это пример синтаксиса apply
, update
.
Когда вы вызываете map("Something")
, это вызывает map.apply("Something")
, который в свою очередь вызывает get
.
Когда вы вызываете map("Something") = "SomethingElse"
, это вызывает map.update("Something", "SomethingElse")
, который в свою очередь вызывает put
.
Взгляните на этот для более полного объяснения.
Ответ 2
Проблема в том, что вы пытаетесь обновить неизменяемую карту. У меня было такое же сообщение об ошибке, когда моя карта была объявлена как
var m = new java.util.HashMap[String, Int]
Но когда я заменил определение на
var m = new scala.collection.mutable.HashMap[String, Int]
работал m.update
.