Странное поведение типа 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
сравнение будет.