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