Scala 添加到不可变哈希集

Scala 添加到不可变哈希集,scala,scala-collections,immutable-collections,Scala,Scala Collections,Immutable Collections,抱歉,伙计们,我最近在第685页的第二版“Scala编程”中看到了一个例子,我觉得很奇怪: var hashSet: Set[C] = new collection.immutable.HashSet hashSet += elem1 如何在不可变的集合中添加内容?我试过REPL,效果很好 > scala Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11). Type in

抱歉,伙计们,我最近在第685页的第二版“Scala编程”中看到了一个例子,我觉得很奇怪:

var hashSet: Set[C] = new collection.immutable.HashSet
hashSet += elem1
如何在不可变的集合中添加内容?我试过REPL,效果很好

> scala
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var s : Set[Int] = collection.immutable.HashSet()
s: Set[Int] = Set()

scala> s += 1324

scala> println(s)
Set(1324)
奇怪的事实是,+=运算符没有在immutable.HashSet api页面中定义。谁能帮我了解一下发生了什么事

谢谢。

注意以下事项:

scala> var hashSet: Set[Int] = new collection.immutable.HashSet
hashSet: Set[Int] = Set()

scala> val set2 = hashSet + 1234
set2: scala.collection.immutable.Set[Int] = Set(1234)

scala> set2
res20: scala.collection.immutable.Set[Int] = Set(1234)

scala> hashSet
res21: Set[Int] = Set()
因此,不会向不可变哈希集添加任何内容<代码>哈希集与构建时相同<代码>+返回一个新的集合,而原始集合不变

当您执行
hashSet+=1234
时,它是scala的缩写(注意,中不存在方法
+=
):

+=
将适用于遵循协议的任何类。简而言之,当您执行
a+=12
a
必须有一个方法
+
,该方法返回与
a
相同的类型,并且
a
应该是可赋值的(即a
var
。它不适用于val。请尝试以下方法:
val i=23;i+=1
)。

简短回答 您有一个
var
,因此可以重新分配给它。因此,在本例中,
+=
将被转换为

hashSet = hashSet + elem
与其他类型一样,只要在其上定义了
+

var i = 0
i += 1
i = i + 1
细节
不可变。HashSeth
具有

创建具有附加元素的新集合,除非该元素为 已经存在

根据


该类中没有定义
+=
方法,因此
+=
将是一个合成方法,通过将右操作数传递给左操作数并将结果赋回左操作数,它将充当对左操作数调用
+
方法的简单操作

您没有添加到
哈希集
。您正在分配给
hashSet
,这很好,因为
hashSet
var
,而不是
val

解释如何消除此类复合赋值运算符:

l ω= r
(其中,
ω
是除
以外的任何运算符字符序列,
且不以
=
开头)将被删除

l.ω=(r)
iff
l
具有或隐式转换为具有名为
ω=
的成员的对象

否则,它会被去糖化为

l = l.ω(r)
(除非
l
保证只评估一次),如果类型检查


这允许像
+=
这样的东西像在其他语言中一样工作,但仍然被重写以执行不同的操作。

无法说明
+=
在语法方面是如何处理的,但添加到不可变的哈希集就像附加到不可变的字符串:您会得到一个包含修改内容的新实例。
l = l.ω(r)