120 votes

Compréhension des énumérations de scala

Je dois dire que je ne comprends pas Scala énumération des classes. Je peux copier-coller de 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._
  • Ce qui signifie type WeekDay = Value et pourquoi dois-je écrire?
  • Pourquoi est - val Mon = Value? Qu'est que cela veut dire?
  • Pourquoi dois-je importer l' WeekDay l'objet? Et,
  • quand j'écris val day = WeekDay.Mon, pourquoi est-il de type WeekDay.Value, pas de type WeekDay?

149voto

0__ Points 23597

l' Enumeration trait a un membre de type Value représentant les différents éléments de l'énumération (c'est en fait un intérieur de classe, mais la différence n'a pas d'importance ici).

Ainsi, object WeekDay hérite de ce type de membre. La ligne type WeekDay = Value est juste un alias de type. Il est utile, car après l'importation d'ailleurs avec import WeekDay._, vous pouvez utiliser ce type, comme par exemple:

def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)

Au lieu de cela, une version minimale serait juste:

object WeekDay extends Enumeration {
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

et vous n' avez qu'à importer le contenu d' object WeekDay, mais vous devez utiliser le type WeekDay.Value et de qualifier les membres individuels. Ainsi, l'exemple devient

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)

La deuxième question porte sur le sens de l' val Mon, ... = Value. C'est en effet très déroutant si vous ne regardez pas dans la mise en œuvre de l' Enumeration. Ce n'est pas l'attribution d'un type de! Il s'agit plutôt d'appeler un protégé de la méthode du même nom, Value, qui renvoie un béton instance de type Value.

Il se trouve que vous pouvez écrire val a, b, c = foo en Scala, et, pour chaque valeur a, b, et c méthode foo sera appelée de nouveau et de nouveau. Enumeration utilise cette astuce pour incrémenter un compteur interne, de sorte que chaque valeur est individuelle.

Si vous ouvrez la Scala API docs pour Enumeration et cliquez sur Visibility: All, vous verrez que la méthode figurant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X