Devo dizer que não entendo as classes de enumeração Scala. Posso copiar e colar o exemplo da documentação, mas não tenho ideia do que está acontecendo.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- O que significa
type WeekDay = Value
e por que eu tenho que escrever isso? - Por que
val Mon = Value
? Afinal, o que isso quer dizer? - Por que tenho que importar o
WeekDay
objeto? E, - quando escrevo
val day = WeekDay.Mon
, por que é do tipoWeekDay.Value
, não do tipoWeekDay
?
Respostas:
a
Enumeration
característica possui um membro de tipo queValue
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 linhatype WeekDay = Value
é apenas um alias de tipo . É útil, porque depois de importá-lo para outro lugarimport WeekDay._
, você pode usar esse tipo, por exemplo:Em vez disso, uma versão mínima seria apenas:
e você não precisa importar o conteúdo de
object WeekDay
, mas precisará usar o tipoWeekDay.Value
e qualificar membros individuais. Então o exemplo se tornariaA segunda pergunta é sobre o significado de
val Mon, ... = Value
. Isso é realmente muito confuso se você não analisar a implementação doEnumeration
. 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 tipoValue
.Acontece que você pode escrever
val a, b, c = foo
em Scala, e para cada valora
,b
e,c
o métodofoo
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 emVisibility: All
, verá esse método aparecendo.fonte
Open(Mon, 8, 20)
e os dias permanecerão uma enumeração simples.