0

What's the diff b/w : 1) Var immutable Map, Val mutable Map & Var mutable Map?

The image attached here is of the same code.

Also, why are all these definitions of a Map acting as if they are mutable?

scala> var var_m_map =  collection.mutable.Map(("key1",1), ("key2",2))
var_m_map: scala.collection.mutable.Map[String,Int] = Map(key2 -> 2, key1 -> 1)

scala> var_m_map += ("key30" -> 30)
res8: scala.collection.mutable.Map[String,Int] = Map(key30 -> 30, key2 -> 2, key1 -> 1)

scala> val val_m_map =  collection.mutable.Map(("key10",10), ("key20",20))
val_m_map: scala.collection.mutable.Map[String,Int] = Map(key20 -> 20, key10 -> 10)

scala> var_m_map += ("key30" -> 30)
res9: scala.collection.mutable.Map[String,Int] = Map(key30 -> 30, key2 -> 2, key1 -> 1)


scala> var var_i_map =  collection.immutable.Map(("key100",100), ("key200",200))
var_i_map: scala.collection.immutable.Map[String,Int] = Map(key100 -> 100, key200 -> 200)

scala> var_i_map += ("key300" -> 300)

scala> var_i_map
res11: scala.collection.immutable.Map[String,Int] = Map(key100 -> 100, key200 -> 200, key300 -> 300)

scala> var var_i_map2 = Map(("key700",700), ("key800",800))
var_i_map2: scala.collection.immutable.Map[String,Int] = Map(key700 -> 700, key800 -> 800)

scala> var_i_map2 += ("key900" -> 900)

scala> var_i_map2
res13: scala.collection.immutable.Map[String,Int] = Map(key700 -> 700, key800 -> 800, key900 -> 900)
Federico klez Culloca
  • 26,308
  • 17
  • 56
  • 95
  • Note that 'var' means the reference is mutable. It doesn't mean the object referred to is mutable. 'val' means the reference is immutable. And adding to an immutable map will return you a new map with your added element – Brian Agnew Jun 24 '20 at 09:39

1 Answers1

0

var var_i_map is a mutable reference to an immutable Map.

+= adds an element to the immutable map currently bound to var_i_map which returns a new immutable map instance. This new instance is the (re)assigned to var_i_map.

Note the immutable collection originally bound to var_i_map is not changed, the mutable var is being changed.

Change var var_i_map to val var_i_map and your code will not compile because you are attempting to change an imutable val.

Terry Dactyl
  • 1,839
  • 12
  • 21