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 typ WeekDay.Value, a nie Typ WeekDay?
 119
Author: Karel Bílek, 2012-06-17

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ę.

 148
Author: 0__,
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