2010-07-09 16 views
9
scala> List(1,2,3) == List(1,2,3) 

res2: Boolean = true 

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

res3: Boolean = true 

Ale gdy próbuje się zrobić to samo z tablicą, to nie działa tak samo. Czemu?Dziwne zachowanie typu Tablica

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

res4: Boolean = false 

Użyłem wersji wstępnej 2.8.0.RC7 i 2.8.0.Beta1.

+1

Uwaga: Można wyszukiwać wszystkie pytania związane z tablicą związaną z Scalą za pomocą [scala] [array] – oluies

+0

możliwy duplikat [Why does \ 'Array (0,1,2) == Array (0,1,2) \' nie zwraca oczekiwanego wyniku?] (http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-expected-result) – Suma

Odpowiedz

17

Ponieważ definicja "równa się" dla tablic jest taka, że ​​odnoszą się one do tej samej tablicy.

Jest to zgodne z równością macierzy Java, używając Object.Equals, więc porównuje odniesienia.

Jeśli chcesz sprawdzić elementy parami, a następnie użyć sameElements

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

lub deepEquals, która została zaniechana w 2,8, więc zamiast używać:

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

Jest dobry Nabble dyskusja na array equality .

+2

Czy Array jest Jedyny wyjątek od ogólnej zasady porównywania faktycznych elementów wbudowanych kolekcji? Wszystkie inne kolekcje, które próbowałem, porównują elementy. –

+2

@olle - o ile mi wiadomo, jest to jedyna kolekcja, która wykazuje takie zachowanie. Nawet 'ArrayList' porównuje elementy. Czego nie mogę się dowiedzieć, jest to, jak należy się tego nauczyć z dokumentacji :) – Stephen

+3

zobacz także http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1- 2-nie-return-the-expected-result – oluies