Подтвердить что ты не робот

Почему `Array (0,1,2) == Array (0,1,2)` не возвращает ожидаемый результат?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Но Scala String также является просто Java Переменные String, но Scala равны сравните естественное равенство.

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