Comprendre les énumérations de scala

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._ 
  • Que signifie le type WeekDay = Value et pourquoi dois-je écrire cela?
  • Pourquoi val Mon = Value ? Qu’est ce que ça veut dire?
  • Pourquoi dois-je importer l’object WeekDay ? Et,
  • quand j’écris 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.