Странное поведение типа Array с оператором `==`

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 ответа

Решение

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

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

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

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

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

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

Есть хорошая дискуссия Nabble о равенстве массивов.

Основная причина в том, что 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 сравнение будет.

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