嵌套映射withDefaultValue更改默认值

时间:2013-10-01 01:51:03

标签: scala map default-value mutable

我有一个包含另一个可变地图的可变地图,两者都有默认值。在为封闭的地图中的一个键指定值后,其默认值似乎发生了变化。 即我希望anotherDefault有值Map(1 - >默认值),NOT 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)

1 个答案:

答案 0 :(得分:4)

外部地图(amap)正在创建内部地图的单个实例以用作默认值。当您通过val bmap = amap(2)访问此内容,然后修改bmap时,您正在修改amap使用的单个默认地图。当您致电amap(3)时,您会返回此默认地图,该地图现在是具有键/值对(1 -> "something")的地图。

你可能想要的是withDefault,而不是withDefaultValue,虽然它需要一些额外的参数/类型规范才能工作:

val amap = Map[Int, MMap[Int, String]]().withDefault(x => MMap[Int, String]().withDefaultValue("default"))