0

我可以使用以下命令更新 mutable.Map 值+=

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

scala> map(5) = 5

scala> map
res55: scala.collection.mutable.Map[Int,Int] = Map(5 -> 5)

scala> map(5) += 1

scala> map
res57: scala.collection.mutable.Map[Int,Int] = Map(5 -> 6)

但我不能使用+=withgetOrElseUpdate也不明白为什么:

scala> map.getOrElseUpdate(5, 0) += 1
<console>:16: error: value += is not a member of Int
  Expression does not convert to assignment because receiver is not assignable.
map.getOrElseUpdate(5, 0) += 1
                          ^

我知道我以前使用过mutable.SortedMapwith值,它让我可以毫无问题mutable.ArrayBuffer地使用该类型的+=操作。我应该使用getOrElseUpdate类似的东西吗?mutable.Int

4

1 回答 1

2

在 scala 中,您不会获得获取变量“引用”的语义,这是因为 scala 的良好风格是当您不自己改变变量时,因此您不能以这种方式执行此操作。而不是这个,你可以用函数来描述突变,而不是用这种方式直接改变变量:

  import scala.collection.mutable
  val map = mutable.Map.empty[Int,Int]
  val yourKey: Int = ???
  map.updateWith(yourKey){
    case Some(i) => Some(i+1)
    case None => Some(1)
  }

我在这里使用了这个:https://www.scala-lang.org/api/2.13.6/scala/collection/mutable/Map.html#updateWith(key:K)(remappingFunction:Option[V]=%3EOption[ V]):选项[V]

此外,数组缓冲区和其他可变集合中的 +、+= 和 +: 函数具有其他语义。

于 2021-09-16T20:16:51.103 回答