【发布时间】:2019-02-07 03:18:01
【问题描述】:
我正在阅读《不耐烦的 Scala》一书
在第 3 章中,遇到了这段代码
val a = Array(1, 7, 2, 9)
scala.util.Sorting.quickSort(a)
// a is now Array(1, 2, 7, 9)
我认为val a 在 Scala 中应该是不可变的?这是怎么回事?
【问题讨论】:
我正在阅读《不耐烦的 Scala》一书
在第 3 章中,遇到了这段代码
val a = Array(1, 7, 2, 9)
scala.util.Sorting.quickSort(a)
// a is now Array(1, 2, 7, 9)
我认为val a 在 Scala 中应该是不可变的?这是怎么回事?
【问题讨论】:
代码不会更改a 的绑定。它改变了a 引用的对象。 a 仍然指向同一个对象,只是该对象的内部状态发生了变化。
The documentation 表示数组是就地排序的(bold强调我的):
def quickSort[K](a: Array[K])(implicit arg0: math.Ordering[K]): Unit使用快速排序对数组
a进行排序,对其元素使用排序。该算法就地排序,因此除了在比较期间可能需要对单个元素进行装箱外,不会使用额外的内存。
【讨论】:
a 是不可变的时,它只是意味着a 的指针没有改变?但是a的内部状态可以改变吗?我认为 Scala 中的每个对象都不能改变其状态或值,因此是不可变的。
scala.collections.mutable 中有一个完整的包含可变类型的包。此外,Scala 被设计为托管在可能支持可变对象的语言平台(例如 JVM、CLI、ECMAScript)上。特别是,如果你在 Scala-JVM 上运行你的代码,那么这个数组实际上就是一个 Java 数组,而且那些肯定是可变的,Scala 不能神奇地改变这个事实。