Mutable映射中的不可变映射支持Mutable操作

时间:2015-11-04 22:55:50

标签: scala

当我注意到这种古怪的行为时,我今天写了一些代码。嵌套在可变映射中的不可变映射似乎允许(通常是可变的)+ =运算符。

scala> val myMutableMap = mutable.Map[String, scala.collection.immutable.Map[String, String]]()
myMutableMap: scala.collection.mutable.Map[String,scala.collection.immutable.Map[String,String]] = Map()

scala> myMutableMap += "outerkey" -> scala.collection.immutable.Map("k1"-> "v1")
res25: myMutableMap.type = Map(outerkey -> Map(k1 -> v1))

scala> myMutableMap("outerkey") += "k2"->"v2"

scala> myMutableMap
res27: scala.collection.mutable.Map[String,scala.collection.immutable.Map[String,String]] = Map(outerkey -> Map(k1 -> v1, k2 -> v2))

scala> val huhwhat = myMutableMap("outerkey")
huhwhat: scala.collection.immutable.Map[String,String] = Map(k1 -> v1, k2 -> v2)

scala> huhwhat += "k3"->"k4"
<console>:21: error: value += is not a member of scala.collection.immutable.Map[String,String]
              huhwhat += "k3"->"k4"

我查看了Map.scala源代码,但没有看到任何可以继承+ =运算符的明显答案。

这是在Scala 2.11.5上。有谁知道发生了什么?

1 个答案:

答案 0 :(得分:3)

myMutableMap("outerkey") += "k2"->"v2"

被编译器解释为

myMutableMap("outerkey") = myMutableMap("outerkey") + ("k2"->"v2")

即,使用添加的密钥myMutableMap("outerkey")从不可变("k2"->"v2")创建新地图,并使用新对myMutableMap更新("outerkey" -> <the new map>)

这是由mutable.MapLike update method实施的,this blog post提供foo(x) = y行为。有关详细信息,请参阅a bunch of other magic functions in Scala(还有一个SO答案列表{{3}})。

相关问题