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

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

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

Люди говорили мне, что Скала Array это просто Java [] который сравнивает только личность. Не было бы более значимым, чтобы переопределить Array"sequals способ сравнить естественное равенство вместо?

3 ответа

Решение

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

Попробуйте следующее в 2.8 (edit/note: начиная с RC3, 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

GenericArray действует так же, как Array, за исключением того, что во все коллекции Scala добавлены вкусности. WrappedArray оборачивает Java [] массив; выше я привел к нему простой массив (проще, чем вызов функции неявного преобразования), а затем сравнил упакованные массивы. Эти обертки, хотя и поддерживаются [] массив, также даст вам все вкусности коллекции.

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

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

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

Другие вопросы по тегам