a Enumerationcaracterística possui um membro de tipo que Valuerepresenta os elementos individuais da enumeração (na verdade, é uma classe interna, mas a diferença não importa aqui).
Assim, object WeekDayherda esse membro do tipo. A linha type WeekDay = Valueé apenas um alias de tipo . É útil, porque depois de importá-lo para outro lugar import WeekDay._, você pode usar esse tipo, por exemplo:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Em vez disso, uma versão mínima seria apenas:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
e você não precisa importar o conteúdo de object WeekDay, mas precisará usar o tipo WeekDay.Valuee qualificar membros individuais. Então o exemplo se tornaria
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
A segunda pergunta é sobre o significado de val Mon, ... = Value. Isso é realmente muito confuso se você não analisar a implementação do Enumeration. Esta não é a atribuição de um tipo! É, em vez de chamar um protegido método de mesmo nome , Valueque retorna uma instância de concreto do tipo Value.
Acontece que você pode escrever val a, b, c = fooem Scala, e para cada valor a, be, co método fooserá chamado novamente e novamente. Enumerationusa esse truque para incrementar um contador interno para que cada valor seja individual.
Se você abrir os documentos da API Scala Enumeratione clicar em Visibility: All, verá esse método aparecendo.