Far*_*arz 2 scala scala-collections immutable-collections
抱歉,我最近在第 685 页的第 2 版“Scala 编程”中看到了一个示例,这对我来说似乎很奇怪:
var hashSet: Set[C] = new collection.immutable.HashSet
hashSet += elem1
Run Code Online (Sandbox Code Playgroud)
如何添加一些不可变的集合?我试过 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)
Run Code Online (Sandbox Code Playgroud)
奇怪的事实是 += 运算符未在immutable.HashSet api 页面中定义。有人可以帮我理解发生了什么吗?
谢谢。
您没有添加到HashSet. 您正在分配给hashSet,这很好,因为hashSet是 a var,而不是 a val。
Scala 语言规范 (SLS) 的第 6.12.4 节赋值运算符解释了如何对此类复合赋值运算符进行脱糖:
l ?= r
Run Code Online (Sandbox Code Playgroud)
(其中,?是比其他操作者字符的任何序列<,>,!并且不与启动=)被脱糖到
l.?=(r)
Run Code Online (Sandbox Code Playgroud)
iff l具有或可隐式转换为具有名为 的成员的对象?=。
否则,它会被脱糖
l = l.?(r)
Run Code Online (Sandbox Code Playgroud)
(除了l保证只评估一次),如果类型检查。
这允许像+=在其他语言中一样工作,但仍然被覆盖以做不同的事情。