Muszę powiedzieć, że nie rozumiem klas wyliczeniowych Scala. Mogę skopiować i wkleić przykład z dokumentacji, ale nie mam pojęcia, co się dzieje.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- Co oznacza
type WeekDay = Value
i dlaczego muszę to napisać? - Dlaczego tak jest
val Mon = Value
? Co to w ogóle znaczy? - Dlaczego muszę zaimportować
WeekDay
obiekt? I, - kiedy piszę
val day = WeekDay.Mon
, dlaczego jest to typWeekDay.Value
, a nie typWeekDay
?
Odpowiedzi:
Enumeration
cecha ma człon typuValue
reprezentujących poszczególne elementy wyliczenia (to faktycznie wewnętrzna klasy, ale różnica nie ma znaczenia tutaj).W ten sposób
object WeekDay
dziedziczy ten typ członkowski. Liniatype WeekDay = Value
to tylko alias typu . Jest to przydatne, ponieważ po zaimportowaniu go w innym miejscu zimport WeekDay._
programem możesz użyć tego typu, np .:Zamiast tego minimalna wersja wyglądałaby po prostu:
i nie musisz importować zawartości
object WeekDay
, ale wtedy musisz użyć typuWeekDay.Value
i kwalifikować poszczególnych członków. Tak wyglądałby przykładDrugie pytanie dotyczy znaczenia
val Mon, ... = Value
. Jest to rzeczywiście bardzo mylące, jeśli nie przyjrzysz się implementacjiEnumeration
. To nie jest przypisanie typu! Jest on chroniony zamiast wywoływania metody o tej samej nazwie ,Value
, która zwraca instancję betonowej typuValue
.Zdarza się, że można napisać
val a, b, c = foo
w Scala, a dla każdej wartościa
,b
orazc
metodafoo
zostanie wywołana ponownie.Enumeration
używa tej sztuczki do zwiększania wewnętrznego licznika, tak aby każda wartość była indywidualna.Jeśli otworzysz dokumentację Scala API dla
Enumeration
i kliknieszVisibility: All
, zobaczysz tę metodę.źródło
Open(Mon, 8, 20)
a dni pozostałyby prostą wyliczeniem.