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, ви побачите, що цей метод з’явиться.