Enumerationcecha ma człon typu Valuereprezentujących poszczególne elementy wyliczenia (to faktycznie wewnętrzna klasy, ale różnica nie ma znaczenia tutaj).
W ten sposób object WeekDaydziedziczy ten typ członkowski. Linia type WeekDay = Valueto tylko alias typu . Jest to przydatne, ponieważ po zaimportowaniu go w innym miejscu z import WeekDay._programem możesz użyć tego typu, np .:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Zamiast tego minimalna wersja wyglądałaby po prostu:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
i nie musisz importować zawartości object WeekDay, ale wtedy musisz użyć typu WeekDay.Valuei kwalifikować poszczególnych członków. Tak wyglądałby przykład
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Drugie pytanie dotyczy znaczenia val Mon, ... = Value. Jest to rzeczywiście bardzo mylące, jeśli nie przyjrzysz się implementacji Enumeration. To nie jest przypisanie typu! Jest on chroniony zamiast wywoływania metody o tej samej nazwie , Value, która zwraca instancję betonowej typu Value.
Zdarza się, że można napisać val a, b, c = foow Scala, a dla każdej wartości a, boraz cmetoda foozostanie wywołana ponownie. Enumerationużywa tej sztuczki do zwiększania wewnętrznego licznika, tak aby każda wartość była indywidualna.
Jeśli otworzysz dokumentację Scala API dla Enumerationi klikniesz Visibility: All, zobaczysz tę metodę.