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 = Value
y por qué tengo que escribir eso? - ¿Por qué es
val Mon = Value
? ¿Y eso que significa? - ¿Por qué tengo que importar el
WeekDay
objeto? Y, - cuando escribo
val day = WeekDay.Mon
, ¿por qué es tipoWeekDay.Value
, no tipoWeekDay
?
Respuestas:
el
Enumeration
rasgo tiene un miembro de tipo queValue
representa los elementos individuales de la enumeración (en realidad es una clase interna, pero la diferencia no importa aquí).Por lo tanto,
object WeekDay
hereda ese miembro de tipo. La líneatype WeekDay = Value
es 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.Value
y 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 ,Value
que devuelve una instancia concreta del tipoValue
.Se da la circunstancia de que puede escribir
val a, b, c = foo
en Scala, y para cada valora
,b
yc
el métodofoo
se llama una y otra vez.Enumeration
usa este truco para incrementar un contador interno para que cada valor sea individual.Si abre los documentos de la API de Scala
Enumeration
y 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.