Zaletą niezmiennych struktur danych, w tym przypadku Ustaw, jest to, że są trwałe. Na przykład:
var jetSet1 = Set("Boeing", "Airbus")
val jetSet2 = jetSet1 // ... imagine jetSet2 is somewhere else in the program
jetSet1 += "Lear"
assert(!jetSet2.contains("Lear"))
Niezmienność tych Zestaw przedmiotów ułatwia rozumować o programie, ponieważ aktualizacje zmiennej jetSet1
nie mają skutków ubocznych w innych częściach kodu (w tym przypadku stosuje się wszędzie tam, gdzie jetSet2
). Chociaż z tego przykładu nie wynika jasno, są sytuacje, w których wygodnie jest przechowywać niezmienne wartości w zmiennych odniesieniach var
; najczęściej, var
będzie miał ograniczony zakres (np. lokalny dla funkcji).
Niezmienne struktury danych często mają sprytne implementacje, które są dość wydajne. Niestety interfejs API Scala nie jest dobrze udokumentowany pod względem wydajności, ale oczekiwałbym, że większość operacji będzie w przybliżeniu czasem O (log N). Na przykład, biorąc pod uwagę duży niezmienny zbiór s
, należy sprawnie zbudować s + x
, nowy zestaw z dodatkowym elementem. Oczywiście, niezmienność gwarantuje, że również zachowana jest s
. Pod maską, s
i s+x
będą przechowywane przy użyciu pewnego rodzaju struktur danych drzewa ze współużytkowanymi komponentami.
Tytuł pytania sugeruje, że szukasz również porady na temat używania val
lub var
. Zasadą jest używanie val
, kiedy tylko możesz. Jeśli wymagany jest var
, spróbuj ograniczyć zakres zmiennej tak bardzo, jak to możliwe.
Nie bezpośrednio w interfejsie API, ale wydajność * jest * [udokumentowana] (http://www.scala-lang.org/docu/files/collections-api/collections.html). – Debilski
Dzięki za link –
Wiele operacji jest, jak można się spodziewać, O (log n), ale należy podkreślić, że podstawa logarytmu jest tak wysoka, że skutecznie wykonuje operacje O (1). Praktycznie rzecz ujmując, operacje na niezmiennych strukturach danych Scala są w stałym współczynniku odpowiednich operacji na ich zmiennym kuzynie. –