у 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
использует этот трюк для увеличения внутреннего счетчика, чтобы каждое значение было индивидуальным.
Если вы откроете документы Scala API для Enumeration
и Visibility: All
нажмете на , вы увидите, что появляется этот метод.