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