у 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нажмете на , вы увидите, что появляется этот метод.