el Enumerationrasgo tiene un miembro de tipo que Valuerepresenta 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ínea type WeekDay = Valuees solo un alias de tipo . Es útil, porque después de importarlo en otro lugar import WeekDay._, puede usar ese tipo, por ejemplo:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
En cambio, una versión mínima sería:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
y no tiene que importar el contenido de object WeekDay, pero luego necesitaría usar type WeekDay.Valuey calificar miembros individuales. Entonces el ejemplo sería
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
La segunda pregunta es sobre el significado de val Mon, ... = Value. De hecho, esto es muy confuso si no analiza la implementación de Enumeration. ¡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 tipo Value.
Se da la circunstancia de que puede escribir val a, b, c = fooen Scala, y para cada valor a, by cel método foose 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 en Visibility: All, verá aparecer ese método.