Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding to immutable HashSet

Sorry guys, I recently saw an example in "Programming in Scala", 2nd Edition on page 685, which seemed strange to me:

var hashSet: Set[C] = new collection.immutable.HashSet
hashSet += elem1

How is it possible to add something an immutable collection? I tried on REPL and it worked ok!

> 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)

The stranger fact is that += operator is not defined in immutable.HashSet api page. Could anybody please help me understand what's going on?

Thanks.

like image 394
Faramarz Avatar asked Apr 08 '26 08:04

Faramarz


1 Answers

You are not adding to the HashSet. You are assigning to hashSet, which is perfectly fine, since hashSet is a var, not a val.

Section 6.12.4 Assignment Operators of the Scala Language Specification (SLS) explains how such compound assignment operators are desugared:

l ω= r

(where ω is any sequence of operator characters other than <, >, ! and doesn't start with =) gets desugared to

l.ω=(r)

iff l has or is implicitly convertible to an object that has a member named ω=.

Otherwise, it gets desugared to

l = l.ω(r)

(except l is guaranteed to be only evaluated once), if that typechecks.

This allows something like += to work like it does in other languages but still be overridden to do something different.

like image 51
Jörg W Mittag Avatar answered Apr 10 '26 21:04

Jörg W Mittag



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!