Je dois dire que je ne comprends pas les classes de dénombrement Scala. Je peux copier-coller l’exemple de la documentation, mais je n’ai aucune idée de ce qui se passe.
object WeekDay extends Enumeration { type WeekDay = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } import WeekDay._
type WeekDay = Value
et pourquoi dois-je écrire cela? val Mon = Value
? Qu’est ce que ça veut dire? WeekDay
? Et, val day = WeekDay.Mon
, pourquoi est-ce que c’est le type WeekDay.Value
, pas le type WeekDay
? le trait Enumeration
a un membre type Value
repré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, l’ object WeekDay
hérite de ce membre de type. Le type WeekDay = Value
ligne type WeekDay = Value
est juste 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 à importer le contenu de l’ object WeekDay
, mais vous devez utiliser le type WeekDay.Value
et 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 vous penchez pas sur l’implémentation de l’ Enumeration
. Ce n’est pas l’affectation d’un type! Au lieu de cela, il appelle une méthode protégée du même nom , Value
, qui renvoie une instance concrète de type Value
.
Il se trouve que vous pouvez écrire val a, b, c = foo
dans Scala, et pour chaque valeur a
, b
et c
la méthode foo
sera appelée encore et encore. Enumeration
utilise cette astuce pour incrémenter un compteur interne afin que chaque valeur soit individuelle.
Si vous ouvrez les documents de l’API Scala pour Enumeration
et cliquez sur Visibility: All
, vous verrez cette méthode apparaître.