我今天写代码时注意到了一个奇怪的行为。似乎不可变映射嵌套在可变映射中允许使用(通常是可变的)+=运算符。
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上。有人知道发生了什么吗?
+=
(或-=
...)方法,它将再次尝试使用foo = foo + bar
并使用它,如果它可以通过类型检查。 反过来,foo(bar) = baz
被解释为foo.update(bar, baz)
,它基本上相当于apply
的“setter”等效项。 - Jörg W Mittag