【问题标题】:Why does `Array(0,1,2) == Array(0,1,2)` not return the expected result?为什么 `Array(0,1,2) == Array(0,1,2)` 不返回预期结果?
【发布时间】:2011-01-29 16:24:28
【问题描述】:

据我了解,Scala 的== 定义了两个对象的自然平等。

我预计Array(0,1,2) == Array(0,1,2) 比较自然平等。例如,检查数组的所有元素在与另一个数组的对应元素比较时是否返回 true。

人们告诉我,Scala 的 Array 只是一个 Java [],它只比较身份。重写Array'sequals 方法来比较自然相等不是更有意义吗?

【问题讨论】:

  • 我不熟悉 Scala。但是,您确定 == 没有比较数组是否是别名(对内存中同一对象的引用)吗?我假设这是一种可能性,因为您提到它与 Java 数组有关。
  • 这是一个不幸的情况,正如其他答案所描述的那样,但是当您知道您正在处理 Array 时,您可以使用 sameElements 并获得您想要的答案,同时避免所有的包装、装箱和迂回。

标签: arrays scala equals equality


【解决方案1】:

Scala 2.7 尝试向 Java [] 数组添加功能,但遇到了有问题的极端情况。 Scala 2.8 已声明 Array[T]T[],但它提供了包装器和等价物。

在 2.8 中尝试以下操作(编辑/注意:从 RC3 开始,GenericArrayArraySeq--感谢 retonym 指出这一点):

import scala.collection.mutable.{GenericArray=>GArray, WrappedArray=>WArray}
scala> GArray(0,1,2) == GArray(0,1,2)
res0: Boolean = true

scala> (Array(0,1,2):WArray[Int]) == (Array(0,1,2):WArray[Int])
res1: Boolean = true

GenericArray 的行为与Array 类似,除了添加了所有 Scala 集合好东西。WrappedArray 包装 Java [] 数组;上面,我向它投射了一个普通数组(比调用隐式转换函数更容易),然后比较了包装的数组。这些包装器虽然由 [] 数组支持,但也为您提供了所有收藏品。

【讨论】:

  • 使用这些类而不是 e. G。一个列表呢?我可以想象 GenericArray/WrappedArray 会增加相当多的开销...
  • 不,实际上,它们增加了很少的开销——WrappedArray 是一个额外的类,它包裹在一个普通的 Java 数组中。 List 需要一个围绕每个元素 的额外类。您使用列表是因为易于使用、酷炫的模式匹配和不变性,而不是为了提高效率。 GenericArray 的位置有点奇怪,不过,作为一个固定大小的数组:大小是不可变的,但内容是可变的。为什么,有人可能想知道,不只是使用ArrayBuffer
  • 由于性能,您可以很好地使用不可变列表。不可变集合可以使您不必制作防御性副本。根据应用程序,这可能超过他们的开销。
  • @ziggystar:这偶尔是真的,我同意,虽然我还没有在自己的代码中遇到过一个案例——做其他事情总是更快,但通常 所以更多的工作,我不会打扰。不可变列表通常在(所需的编码时间)/(所需的执行时间)比率方面做得很好。
  • GenericArray 现在称为ArraySeq
【解决方案2】:

Scala 不会覆盖 Array 的相等性,因为这是不可能的。子类化时只能覆盖方法。由于 Array 没有被子类化(这是不可能的),Scala 不能覆盖它的方法。

【讨论】:

    【解决方案3】:

    但 Scala 的 String 也只是一个 Java 字符串,但 Scala 覆盖等于 比较自然平等。

    Scala 没有覆盖那里的任何东西; java.lang.String 具有 equals() 的值依赖实现(与许多其他 Java 类一样,但与数组不同)。

    【讨论】:

    • 嗨迈克尔,谢谢!我相应地解决了我的问题。基本上我只是想知道为什么不重写 equals 以返回像 Collection 类一样的自然平等(我知道 Array 不属于 Collection 类!)。
    • Scala 将== 解释为equals。就这样。 String 有一个 equals,它做一些与参考身份不同的有用的事情。 [] 没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多