le Enumerationtrait a un membre de type Valuereprésentant les éléments individuels de l'énumération (c'est en fait une classe interne, mais la différence n'a pas d'importance ici).
Ainsi object WeekDayhérite cet élément de type. La ligne type WeekDay = Valuen'est qu'un alias de type . C'est utile, car après l'avoir importé ailleurs avec import WeekDay._, vous pouvez utiliser ce type, par exemple:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Au lieu de cela, une version minimale serait simplement:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
et vous n'avez pas besoin d' importer le contenu de object WeekDay, mais vous devrez alors utiliser le type WeekDay.Valueet qualifier les membres individuels. Ainsi l'exemple deviendrait
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
La deuxième question concerne la signification de val Mon, ... = Value. C'est en effet très déroutant si vous ne regardez pas l'implémentation de Enumeration. Ce n'est pas l'attribution d'un type! Il appelle plutôt une protégée méthode du même nom , Valuequi renvoie une instance de béton de type Value.
Il se trouve que vous pouvez écrire val a, b, c = fooà Scala, et pour chaque valeur a, bet cla méthode foosera appelée encore et encore. Enumerationutilise cette astuce pour incrémenter un compteur interne afin que chaque valeur soit individuelle.
Si vous ouvrez la documentation de l'API Scala pour Enumerationet cliquez sur Visibility: All, vous verrez cette méthode apparaître.