Почему `Array (0,1,2) == Array (0,1,2)` не возвращает ожидаемый результат? - PullRequest
26 голосов
/ 20 марта 2010

Насколько я понимаю, Scala == определяет естественное равенство двух объектов.

Я ожидал, что Array(0,1,2) == Array(0,1,2) сравнивает естественное равенство. Например, проверяет, все ли элементы массива возвращают true при сравнении с соответствующими элементами другого массива.

Люди говорили мне, что Scala Array - это просто Java [], который сравнивает только идентичность. Разве не было бы более целесообразно переопределить метод Array equals для сравнения естественного равенства?

Ответы [ 3 ]

20 голосов
/ 20 марта 2010

Scala 2.7 попытался добавить функциональность в массивы Java [] и столкнулся с проблемными случаями. Scala 2.8 объявил, что Array[T] равен T[], но он предоставляет оболочки и эквиваленты.

Попробуйте следующее в 2.8 (правка / примечание: начиная с RC3, GenericArray равно ArraySeq - спасибо retronym за указание на это):

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 []; выше, я привел к нему простой массив (проще, чем вызов функции неявного преобразования), а затем сравнил упакованные массивы. Эти обертки, хотя и поддерживаются массивом [], также дают вам все полезные свойства коллекции.

8 голосов
/ 20 марта 2010

Scala не отменяет равенство массива, потому что это невозможно. Можно переопределить методы только при создании подклассов. Поскольку массив не имеет подклассов (что невозможно), Scala не может переопределить его методы.

5 голосов
/ 20 марта 2010

Но Scala String - это тоже просто Java Строка, но Scala переопределяет равно сравнить естественное равенство.

Скала там ничего не перекрывает; java.lang.String имеет зависящую от значения реализацию equals() (как и многие другие классы Java, но в отличие от массивов).

...