Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么`Array(0,1,2)==Array(0,1,2)`不返回预期的结果?_Arrays_Scala_Equals_Equality - Fatal编程技术网

Arrays 为什么`Array(0,1,2)==Array(0,1,2)`不返回预期的结果?

Arrays 为什么`Array(0,1,2)==Array(0,1,2)`不返回预期的结果?,arrays,scala,equals,equality,Arrays,Scala,Equals,Equality,据我所知,Scala的=定义了两个对象的自然相等性 我希望Array(0,1,2)=Array(0,1,2)比较自然等式。例如,检查当与另一个数组的相应元素进行比较时,该数组的所有元素是否返回true 人们告诉我Scala的数组只是一个Java[],它只比较身份。替代Array的equals方法来比较自然相等,不是更有意义吗 但是Scala的字符串也只是一个Java 字符串,但Scala覆盖等于 比较自然的平等 Scala不会覆盖那里的任何内容java.lang.String具有依赖于值的equ

据我所知,Scala的
=
定义了两个对象的自然相等性

我希望
Array(0,1,2)=Array(0,1,2)
比较自然等式。例如,检查当与另一个数组的相应元素进行比较时,该数组的所有元素是否返回true

人们告诉我Scala的
数组
只是一个Java
[]
,它只比较身份。替代
Array
equals
方法来比较自然相等,不是更有意义吗

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


Scala不会覆盖那里的任何内容
java.lang.String
具有依赖于值的equals()(与许多其他java类一样,但与数组不同)。

Scala 2.7试图向java
[]
数组添加功能,但遇到了一些问题。Scala 2.8声明
Array[T]
T[]
,但它提供了包装器和等价物

在2.8中尝试以下内容(编辑/注意:从RC3开始,
GenericArray
ArraySeq
——多亏了追溯词指出了这一点):


GenericArray
的作用类似于
Array
,除了添加了所有Scala collections goodies之外
WrappedArray
包装Java
[]
数组;上面,我向它强制转换了一个普通数组(比调用隐式转换函数更容易),然后比较了包装的数组。这些包装器虽然有
[]
数组的支持,但也提供了所有的收藏佳品。

Scala不会覆盖数组的相等性,因为这是不可能的。只能在子类化时重写方法。由于数组没有子类化(这是不可能的),Scala无法重写它的方法。

我对Scala不熟悉。但是,您确定==没有比较数组是否为别名(对内存中相同对象的引用)?我假设这是一种可能性,因为您提到它与Java数组相关。正如其他答案所描述的,这是一种不幸的情况,但是当您知道您正在处理数组时,您可以使用相同的元素并获得您想要的答案,同时避免所有的包装、装箱和绕圈。嗨,Michael,谢谢!我据此修正了我的问题。基本上,我只是想知道为什么不重写equals来返回集合类那样的自然相等(我知道数组不属于集合类!)。Scala将
==
解释为
equals
。就这些<代码>字符串有一个
等于
,它做了一些有用的与引用标识不同的事情<代码>[]没有。是否有任何性能/内存/键入/。。。使用这些类而不是e。G那名单呢?我可以想象GenericArray/WrappedArray会增加相当多的开销……不,实际上,它们只增加很少的开销--
WrappedArray
是一个围绕普通Java数组的额外类<代码>列表要求在每个元素周围都有一个额外的类。使用列表是因为它易于使用,模式匹配和不变性很酷,而不是为了提高效率<但是,作为一个固定大小的数组,code>GenericArray的位置有点奇怪:大小是不可变的,但内容是可变的。有人可能会想,为什么不仅仅使用
ArrayBuffer
?由于性能原因,您可以很好地使用不可变列表。不可变集合可以使您不必制作防御性副本。根据应用程序的不同,这可能会超过它们的开销。@ziggystar:我同意这一点,虽然我自己的代码中还没有遇到过一个案例——做其他事情总是更快,但通常会做更多的工作,我不会费心。不可变列表通常在(所需的编码时间)/(所用的执行时间)比率方面表现良好。
GenericArray
现在称为
ArraySeq
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