2013-03-24 57 views
16

我正在通過Cay Horstmann的Scala處理Impatient書,我遇到了這種更新可變映射的方法。Scala的可變Map更新[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 

它看起來像scores("Alice")命中applyMapLike.scala。但是這隻會返回值,而不是可以更新的值。

出於好奇,我嘗試同樣的語法不變的地圖上,並出現以下錯誤,在此基礎上,我假設scores("Alice") = 5轉化爲scores update ("Alice", 5)

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 
     ^

,但我不知道它是如何工作的,甚至可能的。

它是如何工作的?

+1

我相信這只是句法糖。據我瞭解,這裏沒有深入的基礎教訓。 – placeybordeaux 2013-03-24 22:23:29

+1

正如你所看到的,'update'方法被調用,而不是'apply'方法。 – 2013-03-24 22:27:12

+0

不可變的手段**只讀**和可變意味着**讀/寫**,所以問題被提升 – 2014-12-26 10:09:38

回答

22

這是applyupdate語法的示例。

當您撥打map("Something")時,會調用map.apply("Something"),然後調用get

當您撥打map("Something") = "SomethingElse"這調用map.update("Something", "SomethingElse"),而這又調用put

請看this以獲得更全面的解釋。

-1

問題是你試圖更新不可變的地圖。我有同樣的錯誤消息時,我的地圖被宣佈爲

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

但是當我通過

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

取代的定義m.update工作。

+0

OP明確定義映射爲可變。 – Jason 2016-04-07 00:00:49

+0

hashMap是可變集合 – BDR 2016-10-09 05:23:16

相關問題