我正在阅读 Seven Languages in Seven Weeks体验不同的编程范式。在关于 Scala 的章节中,我发现集合是不可变的(至少 scala.collection.immutable
中的那个)。
但是,有一个让我感到困惑的例子:
scala> val hashMap = HashMap(0->0)
scala> hashMap += 1->1
scala> hashMap
res42: scala.collection.mutable.HashMap[Int,Int] = Map(1 -> 1, 0 -> 0)
但是
scala> map = map + 2->2
<console>:9: error: reassignment to val
map = map + 2->2
是 +=
重新分配一个不可变集合吗? +=
如何在 =
失败时重新分配 val
HashMap
?
此外,我尝试了其他集合(List
和 Map
)以及“原始”(Int
)和 +=
因重新分配错误而失败。怎么样HashMap特别吗?我没有阅读 Scala API 中的任何特定内容,也找不到 +=
运算符的定义(我假设它是一个运算符而不是一个函数,即使在 Scala 中,以及在 C++ 或Java).
很抱歉提出这个愚蠢的问题,但由于我是 Scala 的新手,所以我很难自己找到资源。
最佳答案
你是对的,这适用于 var
,编译器可以在其中使用
hashMap += 1->1
然后将其脱糖
hashMap = hashMap + 1->1
但是还有另一种可能性。如果您的 hashMap
是 scala.collection.mutable.hashMap
类型,那么它会直接调用定义在该类型上的 +=
方法:
hashMap.+=(1->1)
没有 val
被重新分配, map 只是在内部改变自己。
关于斯卡拉 HashMap : doesn't += reassign to left hand side?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634341/