1

我有一个可变映射,其中包含另一个可变映射,两者都具有默认值。在我为封闭映射中的一个键赋值后,它的默认值似乎发生了变化。即,我希望 anotherDefault 具有值 Map(1 -> default),而不是 Map(1 -> something)。

为什么会这样?

scala> import scala.collection.mutable.{Map => MMap}
import scala.collection.mutable.{Map=>MMap}

scala> val amap = Map[Int, MMap[Int, String]]().withDefaultValue(MMap().withDefaultValue("default"))
amap: scala.collection.immutable.Map[Int,scala.collection.mutable.Map[Int,String]] = Map()

scala> val bmap = amap(2)
bmap: scala.collection.mutable.Map[Int,String] = Map()

scala> bmap(1)
res17: String = default

scala> bmap(1) = "something"

scala> val anotherDefault = amap(3)
anotherDefault: scala.collection.mutable.Map[Int,String] = Map(1 -> something)
4

1 回答 1

4

外部地图 ( amap) 正在创建内部地图的单个实例以用作默认值。当您通过访问它val bmap = amap(2),然后修改bmap时,您正在修改amap. 当您调用 时amap(3),您会取回这个默认映射,它现在是一个带有键/值对的映射(1 -> "something")

您可能想要的是withDefault, not withDefaultValue,尽管它需要一些额外的参数/类型规范才能工作:

val amap = Map[Int, MMap[Int, String]]().withDefault(x => MMap[Int, String]().withDefaultValue("default"))
于 2013-10-01T02:03:46.407 回答