Tengo que decir que no entiendo las clases de enumeración de Scala. Puedo copiar y pegar el ejemplo de la documentación, pero no tengo idea de lo que está sucediendo.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- ¿Qué significa
type WeekDay = Valuey por qué tengo que escribir eso? - ¿Por qué es
val Mon = Value? ¿Y eso que significa? - ¿Por qué tengo que importar el
WeekDayobjeto? Y, - cuando escribo
val day = WeekDay.Mon, ¿por qué es tipoWeekDay.Value, no tipoWeekDay?

Respuestas:
el
Enumerationrasgo tiene un miembro de tipo queValuerepresenta los elementos individuales de la enumeración (en realidad es una clase interna, pero la diferencia no importa aquí).Por lo tanto,
object WeekDayhereda ese miembro de tipo. La líneatype WeekDay = Valuees solo un alias de tipo . Es útil, porque después de importarlo en otro lugarimport WeekDay._, puede usar ese tipo, por ejemplo:En cambio, una versión mínima sería:
y no tiene que importar el contenido de
object WeekDay, pero luego necesitaría usar typeWeekDay.Valuey calificar miembros individuales. Entonces el ejemplo seríaLa segunda pregunta es sobre el significado de
val Mon, ... = Value. De hecho, esto es muy confuso si no analiza la implementación deEnumeration. ¡Esta no es la asignación de un tipo! En su lugar, está llamando a una protegida método del mismo nombre ,Valueque devuelve una instancia concreta del tipoValue.Se da la circunstancia de que puede escribir
val a, b, c = fooen Scala, y para cada valora,bycel métodofoose llama una y otra vez.Enumerationusa este truco para incrementar un contador interno para que cada valor sea individual.Si abre los documentos de la API de Scala
Enumerationy hace clic enVisibility: All, verá aparecer ese método.fuente
Open(Mon, 8, 20)y los días seguirán siendo una enumeración plana.