Das EnumerationMerkmal hat ein Typelement, Valuedas die einzelnen Elemente der Aufzählung darstellt (es ist eigentlich eine innere Klasse, aber der Unterschied spielt hier keine Rolle).
Somit object WeekDayerbt, förmigen Bauteils. Die Zeile type WeekDay = Valueist nur ein Typalias . Dies ist nützlich, da Sie diesen import WeekDay._Typ verwenden können, nachdem Sie ihn an eine andere Stelle importiert haben , z.
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Stattdessen wäre eine minimale Version nur:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
und Sie müssen nicht müssen den Inhalt importieren object WeekDay, aber dann würden Sie brauchen Typ zu verwenden WeekDay.Valueund die einzelnen Mitglieder zu qualifizieren. So würde das Beispiel werden
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Die zweite Frage betrifft die Bedeutung von val Mon, ... = Value. Dies ist in der Tat sehr verwirrend, wenn Sie sich nicht mit der Implementierung von befassen Enumeration. Dies ist nicht die Zuordnung eines Typs! Stattdessen wird eine geschützte Methode mit demselben Namen aufgerufen Value, die eine konkrete Instanz vom Typ zurückgibt Value.
So kommt es , dass Sie schreiben können val a, b, c = fooin Scala, und für jeden Wert a, bund cdas Verfahren foowird wieder und wieder aufgerufen werden. EnumerationMit diesem Trick wird ein interner Zähler so erhöht, dass jeder Wert individuell ist.
Wenn Sie die Scala-API-Dokumente für öffnen Enumerationund auf klicken Visibility: All, wird diese Methode angezeigt.