a Enumeration
característica possui um membro de tipo que Value
representa os elementos individuais da enumeração (na verdade, é uma classe interna, mas a diferença não importa aqui).
Assim, object WeekDay
herda 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.Value
e 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 , Value
que retorna uma instância de concreto do tipo Value
.
Acontece que você pode escrever val a, b, c = foo
em Scala, e para cada valor a
, b
e, c
o método foo
será chamado novamente e novamente. Enumeration
usa esse truque para incrementar um contador interno para que cada valor seja individual.
Se você abrir os documentos da API Scala Enumeration
e clicar em Visibility: All
, verá esse método aparecendo.