Enumeration
cecha ma człon typu Value
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. Linia type WeekDay = Value
to 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.Value
i 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 = foo
w Scala, a dla każdej wartości a
, b
oraz c
metoda foo
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 klikniesz Visibility: All
, zobaczysz tę metodę.