Scala niezrozumienie pewnej kwestii w kolekcjach Set

0

Hej, można powiedzieć, że zaczynam przygodę ze Scalą. Aktualnie przerabiam książkę twórcy "Programming in Scala". Problem jest taki, że nie wiem jak rozumieć kwestie z Set i HashSet. Wiem, że Set to trait a HashSet to klasa, że jeśli set ma 5 i więcej elementów to ma typ HashSet a jeśli mniej to typ Set. Wiem że traity to coś w stylu interfejsów w Javie. No ale po co jest ten trait Set? Czy nie można by było tworzyć obiekty tylko z klasy HashSet? A skoro Set to trait i nie można tworzyć jego instancji, to dlaczego set poniżej pięciu elementów jest typu Set? Prosiłbym o w miarę proste wytłumaczenie tego, być może nie rozumiem jeszcze zbytnio działania traitów lub czegoś innego i to mi przeszkadza w pojęciu tej kwestii.
Pozdrawiam

0

Traity są bardziej jak klasy abstrakcyjne w C++, boo mogą zawierać gotowe metody. Z tego co widzę, można tworzyć instancje traitów, które nie mają brakujących definicji.
Coś nie wydaje mi się, żeby była magiczna granica 5 elementów gdy set staje się hashsetem, z czego miałoby to wynikać? A nawet jeśli to co? Nie przejmował byn się takim szczegółem. Przedwczesna optymalizuja to zły nawyk.

0

jeśli set ma 5 i więcej elementów to ma typ HashSet a jeśli mniej to typ Set

?? Masz jakieś źródło tej informacji?

0

W Scalowym object Set widać object EmptySet, class Set1, ..., class Set4: https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/immutable/Set.scala Te wyspecjalizowane podklasy są niskopoziomową optymalizacją.

Scala nie zawiera interfejsów (na poziomie składni, jednak czasem kompilator Scali jest w stanie zakodować traita jako sam zwykły interfejs). Zamiast tego są traity i te też da się wielodziedziczyć. Są pewne znaczące różnice między interfejsami i traitami, np traity mogą zawierać stan.

0

Jeśli chodzi o tę różnicę:
https://stackoverflow.com/questions/7018659/the-difference-between-hashset-and-set-in-scala
According to 2, the default implementation for an immutable set has special representation for empty set and sets size up to 4. Immutable sets size 5 and above and mutable sets all use hashSet.

https://stackoverflow.com/questions/18759913/what-is-the-difference-between-hashset-and-set-and-when-should-each-one-be-used/18761037#18761037
Number of elements Implementation
0 scala.collection.immutable.EmptySet
1 scala.collection.immutable.Set1
2 scala.collection.immutable.Set2
3 scala.collection.immutable.Set3
4 scala.collection.immutable.Set4
5 or more scala.collection.immutable.HashSet

No i tak samo wychodzi jak to sobie to w konsoli wklepie:

scala> val testSet = scala.collection.immutable.Set("4", "p", "r", "o") 
testSet: scala.collection.immutable.Set[String] = Set(4, p, r, o) 

scala> val testSet2 = scala.collection.immutable.Set("4", "p", "r", "o", "g")]
testSet2: scala.collection.immutable.Set[String] = HashSet(4, g, p, r, o)

Zresztą, może rzeczywiście nie powinienem przejmować się takimi rzeczami. Na moim poziomie są raczej nieistotne. Tak czy inaczej dzięki wszystkim za odpowiedzi ;)

0

W wyniku testSet: scala.collection.immutable.Set[String] = Set(4, p, r, o) to co jest po lewej, czyli testSet: scala.collection.immutable.Set[String] to jest statycznie obliczony typ, natomiast to co jest po prawej, czyli Set(4, p, r, o) to jest wynik .toStringa, a w nim może być cokolwiek. Jak chcesz się dostać do nazwy klasy to odpal .getClass i wtedy będziesz pewien co tam w środku siedzi.

Generalnie na wyniki REPLa trzeba czasami trochę uważać. Spróbuj odpalić Option(new Object { override def toString = "null"}) - to jest WTF :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1