斯卡拉 HashMap : doesn't += reassign to left hand side?

标签 scala immutability

我正在阅读 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
此外,我尝试了其他集合(ListMap)以及“原始”(Int)和 += 因重新分配错误而失败。怎么样HashMap特别吗?我没有阅读 Scala API 中的任何特定内容,也找不到 += 运算符的定义(我假设它是一个运算符而不是一个函数,即使在 Scala 中,以及在 C++ 或Java).
很抱歉提出这个愚蠢的问题,但由于我是 Scala 的新手,所以我很难自己找到资源。

最佳答案

你是对的,这适用于 var,编译器可以在其中使用

hashMap += 1->1

然后将其脱糖

hashMap = hashMap + 1->1

但是还有另一种可能性。如果您的 hashMapscala.collection.mutable.hashMap 类型,那么它会直接调用定义在该类型上的 += 方法:

hashMap.+=(1->1)

没有 val 被重新分配, map 只是在内部改变自己。

关于斯卡拉 HashMap : doesn't += reassign to left hand side?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634341/

相关文章:

java - 将文件从 HDFS 附加到 javax.mail 电子邮件

java - 为什么要在 Java 中将不可变类声明为 Final?

arrays - D 中不可变长度的可变数组

scala - 为什么以下两个函数不会产生相同的输出?

scala - 当生成的存在类型太复杂时,toList on shapeless HList 失败

scala - spark-hadoop参数

concurrency - Java中的不可变bean

f# - 在F#中使用StringBuilder是否正确?

java - 在java中部分创建不可变对象(immutable对象)

scala - Slick - 第一个示例 - 我从哪里获得包含 "Database"包的 jar?