Почему `Array (0,1,2) == Array (0,1,2)` не возвращает ожидаемый результат?
Насколько я понимаю, Scala == определяет естественное равенство двух объектов.
Я ожидал, что Array(0,1,2) == Array(0,1,2)
сравнивает естественное равенство. Например, проверяет, возвращаются ли все элементы массива true по сравнению с соответствующими элементами другого массива.
Люди сказали мне, что Scala Array
- это просто Java []
, который сравнивает только идентификатор. Разве не было бы более целесообразным переопределить метод Array
s equals
для сравнения естественного равенства вместо?
Ответы
Ответ 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, но в отличие от массивов).