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

2024-03-25

In Scala 编程 http://www.artima.com/shop/programming_in_scala_2ed作者写道 Scala 的==函数比较值相等而不是引用相等。

这在列表上按预期工作:

scala> List(1,2) == List(1,2)
res0: Boolean = true

但它不适用于数组:

scala> Array(1,2) == Array(1,2)
res1: Boolean = false

作者建议使用相同元素 http://www.scala-lang.org/api/current/index.html#scala.Array函数代替:

scala> Array(1,2).sameElements(Array(1,2))
res2: Boolean = true

作为解释,他们写道:

虽然这看起来似乎不一致,但鼓励对两个可变数据结构的相等性进行显式测试是语言设计者的保守方法。从长远来看,它应该可以避免您的条件出现意外结果。

  1. 这是什么意思?什么样的意想不到的结果他们在谈论什么?如果数组在相同位置包含相同元素,除了返回 true 之外,我还能从数组比较中得到什么?为什么 equals 函数起作用List但不上Array?

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


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

为了让数组看起来像其他集合,我们付出了很多努力,但这是一个漏洞百出的抽象,最终这是不可能的。我认为正确的是,我们应该走向另一个极端,按原样提供本机数组,使用隐式机制来增强其功能。最明显的问题是 toString 和 equals,因为它们在数组上都没有以合理的方式运行,但我们无法通过隐式转换拦截这些调用,因为它们是在 java.lang.Object 上定义的。 (仅当表达式不类型检查时才会发生转换,而这些表达式始终类型检查。)

所以你可以选择你的解释,但最终底层架构对数组的处理方式从根本上不同,并且没有办法在不付出代价的情况下掩盖这一点。这并不是一个可怕的情况,但你必须意识到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Array 的 == 函数对于 Array(1,2) == Array(1,2) 不返回 true? 的相关文章

随机推荐