1

我正在尝试在Scala中构建一个从整数到一组可变整数的可变映射。

例如,我希望拥有 1 -> (2,3) 形式的映射,并且以后能够使用键值更新它们。我使用的代码如下:

import scala.collection.mutable._

val map = Map[Int, Set[Int]]()
map: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = Map()

map += (1 -> Set(2,3))
res15: map.type = Map(1 -> Set(2, 3))

到目前为止很好,但是当我尝试做类似的事情时

map.get(1) += 4

我得到了 val 错误的分配。令我困惑的是 map.get() 应该返回一个可以更新的 scala.collection.mutable.Set 类型的 Set。有人可以解释一下这里发生了什么吗?

4

2 回答 2

3

这种情况下的问题是get()返回一个选项 ( Option[scala.collection.mutable.Set[Int]]),您需要“解包”它:

map.get(1).get += 4

Map 的get()函数返回一个选项的原因是任何给定的键都可能没有值,并且 Scala 不喜欢像它的 Java API 对应物那样抛出异常。

或者,您可以使用该apply()方法,该方法直接返回请求的值并在失败时抛出异常:

map(1) += 4

不过,我还没有完全弄清楚为什么您尝试过的代码会出现“重新分配给 val”错误。在我的情况下(Scala 2.10),它说明了以下内容:

<console>:12: error: value += is not a member of Option[scala.collection.mutable.Set[Int]]
          map.get(1) += 1

您使用的是哪个版本的 Scala?

于 2013-01-20T21:17:55.030 回答
0

更优雅的方式是

map.get(1).map(_ += 4).getOrElse{map += 1 -> Seq(4)}
于 2013-01-26T15:46:58.600 回答