Почему `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, но в отличие от массивов).