【问题标题】:Nested Map withDefaultValue changes default value嵌套地图 withDefaultValue 更改默认值
【发布时间】:2013-10-07 01:16:13
【问题描述】:

我有一个可变映射,其中包含另一个可变映射,两者都具有默认值。在我为封闭映射中的一个键赋值后,它的默认值似乎发生了变化。 IE。我希望 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)

【问题讨论】:

    标签: scala map default-value mutable


    【解决方案1】:

    外部映射 (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"))
    

    【讨论】:

    • 如果是这种情况,是否意味着可变映射上的 withDefaultValue() 没有用,甚至会产生误导?
    • 一点也不 - bmap(4) 仍然会产生值“默认”,而不是抛出 NoSuchElementException。
    • 所以一个defaultValue不是不可变的,我们可以在不知不觉中改变默认值。这有点出乎意料。
    • 非常感谢 withDefault() 的澄清!
    • 您提供的默认值并不是不可变的,因为您提供了一个可变映射。如果您提供了不可变映射,那么您的默认值确实是不可变的。
    猜你喜欢
    • 2012-07-19
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2014-08-12
    • 2018-03-25
    相关资源
    最近更新 更多