Scala 添加到不可变哈希集
抱歉,伙计们,我最近在第685页的第二版“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
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
应该是可赋值的(即avar
。它不适用于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)
iffl
具有或隐式转换为具有名为ω=
的成员的对象
否则,它会被去糖化为
l = l.ω(r)
(除非l
保证只评估一次),如果类型检查
这允许像
+=
这样的东西像在其他语言中一样工作,但仍然被重写以执行不同的操作。无法说明+=
在语法方面是如何处理的,但添加到不可变的哈希集就像附加到不可变的字符串:您会得到一个包含修改内容的新实例。
l = l.ω(r)