Zrozumienie wyliczeń Scali
Muszę powiedzieć, że nie rozumiem klas wyliczania Scali. Mogę skopiować-wkleić przykład z dokumentacji, ale nie mam pojęcia o co chodzi.
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
val Mon = Value
? Co to w ogóle znaczy? - Dlaczego muszę importować
WeekDay
obiekt? Oraz, - kiedy piszę
val day = WeekDay.Mon
, Dlaczego jest to typWeekDay.Value
, a nie TypWeekDay
?
1 answers
Cecha Enumeration
ma element typu Value
reprezentujący poszczególne elementy wyliczenia(w rzeczywistości jest to klasa wewnętrzna, ale różnica nie ma tu znaczenia).
Zatem object WeekDay
dziedziczy ten typ elementu. Linia type WeekDay = Value
jest po prostu aliasem typu . Jest to przydatne, ponieważ po zaimportowaniu go gdzie indziej za pomocą import WeekDay._
, możesz użyć tego typu, np.:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Zamiast tego Minimalna wersja brzmiałaby po prostu:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
I nie musisz importować zawartość object WeekDay
, ale wtedy trzeba by użyć type WeekDay.Value
i zakwalifikować poszczególnych członków. Tak więc przykład stałby się
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 przyjrzymy się implementacji Enumeration
. To nie jest zadanie typu! Zamiast tego wywołanie protected metody o tej samej nazwie, Value
, która zwraca konkretną instancję typu Value
.
Tak się składa, że można pisać val a, b, c = foo
w Scali, a dla każdej wartości a
, b
, i c
metoda foo
będzie wywoływana wielokrotnie. Enumeration
używa tej sztuczki do zwiększenia wewnętrznego licznika tak, że każda wartość jest indywidualna.
Jeśli otworzysz dokumenty API Scala dla Enumeration
i klikniesz na Visibility: All
, zobaczysz tę metodę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-16 22:26:48