Странное поведение типа Array с оператором `==` - PullRequest
10 голосов
/ 09 июля 2010
scala> List(1,2,3) == List(1,2,3)

res2: Boolean = true

scala> Map(1 -> "Olle") == Map(1 -> "Olle")

res3: Boolean = true

Но при попытке сделать то же самое с массивом, он не работает так же.Почему?

scala> Array('a','b') == Array('a','b')

res4: Boolean = false

Я использовал 2.8.0.RC7 и 2.8.0.Beta1-пререлиз.

Ответы [ 2 ]

19 голосов
/ 09 июля 2010

Поскольку определение "равно" для массивов состоит в том, что они ссылаются на один и тот же массив.

Это согласуется с равенством массивов Java с использованием Object.Equals, поэтому сравниваются ссылки.

Если вы хотите проверить попарные элементы, используйте sameElements

Array('a','b').sameElements(Array('a','b'))

или deepEquals, который устарел в 2.8, поэтому вместо него используйте:

Array('a','b').deep.equals(Array('a','b').deep)

Хорошее обсуждение Наббла о равенстве массивов .

0 голосов
/ 12 апреля 2018

Основная причина в том, что Scala использует ту же реализацию Array, что и Java , и это единственная коллекция, которая не поддерживает == в качестве оператора равенства.

Также важно отметить, что выбранный ответ предлагает в равной степени sameElements и deep сравнение, когда на самом деле предпочтительнее использовать:

Array('a','b').deep.equals(Array('a','b').deep)

Или, потому что теперь мы можем использовать ==обратно снова:

Array('a','b').deep == Array('a','b').deep

Вместо:

Array('a','b').sameElements(Array('a','b'))

Поскольку sameElements не подходит для вложенного массива, это не рекурсивно.И deep сравнение будет.

...