scala - 为什么可以改变 immutable.SortedMap 和 immutable.TreeMap?

标签 scala

为什么可以改变 scala.collection.immutable.SortedMapscala.collection.immutable.TreeMap

scala> import scala.collection.immutable.SortedMap
import scala.collection.immutable.SortedMap

scala> var sm = SortedMap(3 -> 'x', 1 -> 'x', 4 -> 'x')
sm: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 3 -> x, 4 -> x)

scala> sm += (2 -> 'x')

scala> sm
res1: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 2 -> x, 3 -> x, 4 -> x)

另外,我没有看到

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.SortedMap

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.TreeMap

一个+=的定义,那么它是怎么存在的呢?

最佳答案

我同意语法使它看起来像你正在改变对象,但实际上 += 操作只是对原始添加的语法糖(使用 + 运算符),然后重新分配(当原始变量是 var 时)。所以:

scala> import scala.collection.immutable.SortedMap
import scala.collection.immutable.SortedMap

scala> var sm = SortedMap(3 -> 'x', 1 -> 'x', 4 -> 'x')
sm: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 3 -> x, 4 -> x)

scala> sm += (2 -> 'x')

scala> sm
res1: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 2 -> x, 3 -> x, 4 -> x)

相当于:

scala> var sm2 = SortedMap(3 -> 'x', 1 -> 'x', 4 -> 'x')
sm2: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 3 -> x, 4 -> x)

scala> sm2 = sm2 + (2 -> 'x')
sm2: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 2 -> x, 3 -> x, 4 -> x)

您可以通过尝试使用 val 来查看:

scala> val sm3 = SortedMap(3 -> 'x', 1 -> 'x', 4 -> 'x')
sm3: scala.collection.immutable.SortedMap[Int,Char] = Map(1 -> x, 3 -> x, 4 -> x)

scala> sm3 += (2 -> 'x')
<console>:10: error: value += is not a member of scala.collection.immutable.SortedMap[Int,Char]
              sm3 += (2 -> 'x')

要进行比较,请查看此可变映射:

scala> val sm4 = scala.collection.mutable.Map[Int, Char](1 -> 'x')
sm4: scala.collection.mutable.Map[Int,Char] = Map(1 -> x)


scala> sm4.put(2, 'x')
res6: Option[Char] = None

scala> sm4
res7: scala.collection.mutable.Map[Int,Char] = Map(2 -> x, 1 -> x)

在这里,我们能够更改 val 映射的内容,只有当对象是可变的时才能执行此操作。

关于scala - 为什么可以改变 immutable.SortedMap 和 immutable.TreeMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38089435/

相关文章:

scala - Akka微服务之间如何共享通信模型?

scala - 在 map 中组合过滤器

scala - 如何从另一个类访问案例类方法?

java - 如何从现有的 java.util.Date 对象中单独获取时间和日期部分

scala - Scala 的依赖注入(inject)

使用 Scala 进行安卓开发

c# - 为什么LINQ操作会丢失集合的静态类型?

scala - 什么是 Spark 流中的饥饿场景?

python - Scala 读取连续的 http 流

scala - Hbase 0.96 与 Spark v 1.0+