为什么Array的==函数不为Array(1,2)== Array(1,2)返回true?

Ste*_*idt 22 scala

Scala编程中,作者写道Scala的==函数比较值相等而不是引用相等.

这在列表上按预期工作:

scala> List(1,2) == List(1,2)
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)

但它不适用于数组:

scala> Array(1,2) == Array(1,2)
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

作者建议使用sameElements函数:

scala> Array(1,2).sameElements(Array(1,2))
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)

作为解释,他们写道:

虽然这看似不一致,但鼓励对两个可变数据结构的相等性进行明确测试是语言设计者的保守方法.从长远来看,它可以帮助您避免条件下的意外结果.

  1. 这是什么意思?他们在谈论什么样的意外结果?如果数组在相同位置包含相同的元素,那么我还能从数组比较中得到什么呢?为什么equals函数可以工作List但不能工作Array

  2. 如何使equals函数在数组上起作用?

psp*_*psp 27

确实,书中提供的解释是值得怀疑的,但公平地说,当它们写出来时更加可信.在2.8中它仍然是正确的,但我们必须改进不同的推理,因为正如你已经注意到的那样,所有其他集合都进行了元素比较,即使它们是可变的.

为了让Arrays看起来像收集的其他部分,已经流了很多血,但这是一个极其漏洞的抽象,最终它是不可能的.我认为,正确地确定我们应该转向另一个极端,并按照它们的方式提供本机阵列,使用隐式机制来增强其功能.其中最明显的是toString和equals,因为它们都没有在Arrays上以合理的方式运行,但我们不能用隐式转换拦截这些调用,因为它们是在java.lang.Object上定义的.(仅当表达式未进行类型检查时才会发生转换,并且这些转换始终会进行类型检查.)

所以你可以选择你的解释,但最终阵列的底层架构会有不同的处理方式,没有办法在没有付出代价的情况下对其进行处理.这不是一个糟糕的情况,但这是你必须要注意的事情.

  • 对我自己而言,编程很少,但"最不痛苦的妥协"并不是因为这使我无法享受它.对于世界其他地方而言,我要说你的解释是一个公平的总结. (6认同)

oll*_*erg 7

这个确切的问题已被多次表达过(我自己也看到了Array类型的奇怪行为).

请注意,它只是Array不支持的集合==,所有其他集合都支持.根本原因是ArrayIS是Java array.