Enumeration
черта имеет тип элемента Value
, представляющий отдельные элементы перечисления (на самом деле это внутренний класс, но разница здесь не имеет значения).
Таким образом, object WeekDay
наследует этот тип члена. Линия type WeekDay = Value
- это просто псевдоним . Это полезно, потому что после того, как вы импортировать его в другом месте с import WeekDay._
, вы можете использовать этот тип, например:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Вместо этого, минимальная версия будет просто:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
и вы не есть до импортировать содержимое object WeekDay
, но тогда вам нужно будет использовать тип WeekDay.Value
и квалифицировать отдельных участников. Таким образом, пример стал бы
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Второй вопрос о значении val Mon, ... = Value
. Это действительно очень сбивает с толку, если вы не изучите реализацию Enumeration
. Это не назначение типа! Вместо этого он вызывает защищенный метод с тем же именем, Value
, который возвращает конкретный экземпляр типа Value
.
Получилось так, что вы можете написать val a, b, c = foo
в Scala, и для каждого значения a
, b
и c
метода foo
будет вызываться снова и снова. Enumeration
использует этот трюк, чтобы увеличить внутренний счетчик, чтобы каждое значение было индивидуальным.
Если вы откроете документы API Scala для Enumeration
и нажмите Visibility: All
, вы увидите, что этот метод появляется.
Я написал небольшой обзор о scala Перечисления и альтернативы, вам может пригодиться: pedrorijo.com/blog/scala-enums/ – pedrorijo91