【问题标题】:Scala scala.util.Sorting.quickSort is changing the value of an array?Scala scala.util.Sorting.quickSort 正在改变数组的值?
【发布时间】: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 中应该是不可变的?这是怎么回事?

【问题讨论】:

标签: arrays scala


【解决方案1】:

代码不会更改a 的绑定。它改变了a 引用的对象。 a 仍然指向同一个对象,只是该对象的内部状态发生了变化。

The documentation 表示数组是就地排序的(bold强调我的):

def quickSort[K](a: Array[K])(implicit arg0: math.Ordering[K]): Unit

使用快速排序对数组a 进行排序,对其元素使用排序。该算法就地排序,因此除了在比较期间可能需要对单个元素进行装箱外,不会使用额外的内存。

【讨论】:

  • Hmm.. 所以当它说a 是不可变的时,它只是意味着a 的指针没有改变?但是a的内部状态可以改变吗?我认为 Scala 中的每个对象都不能改变其状态或值,因此是不可变的。
  • 这不是真的。 Scala 是一种面向对象的语言。任何对象都可以决定如何处理自己的内部状态。大多数 Scala 程序员选择编写不可变对象,但他们并非必须这样做。例如,scala.collections.mutable 中有一个完整的包含可变类型的包。此外,Scala 被设计为托管在可能支持可变对象的语言平台(例如 JVM、CLI、ECMAScript)上。特别是,如果你在 Scala-JVM 上运行你的代码,那么这个数组实际上就是一个 Java 数组,而且那些肯定可变的,Scala 不能神奇地改变这个事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2021-05-29
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多