Ich muss sagen, dass ich Scala-Aufzählungsklassen nicht verstehe. Ich kann das Beispiel aus der Dokumentation kopieren und einfügen, habe aber keine Ahnung, was los ist.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- Was bedeutet
type WeekDay = Value
und warum muss ich das schreiben? - Warum ist
val Mon = Value
? Was bedeutet das überhaupt? - Warum muss ich das
WeekDay
Objekt importieren ? Und, - Wenn ich schreibe
val day = WeekDay.Mon
, warum ist es TypWeekDay.Value
, nicht TypWeekDay
?
Antworten:
Das
Enumeration
Merkmal hat ein Typelement,Value
das die einzelnen Elemente der Aufzählung darstellt (es ist eigentlich eine innere Klasse, aber der Unterschied spielt hier keine Rolle).Somit
object WeekDay
erbt, förmigen Bauteils. Die Zeiletype WeekDay = Value
ist nur ein Typalias . Dies ist nützlich, da Sie diesenimport WeekDay._
Typ verwenden können, nachdem Sie ihn an eine andere Stelle importiert haben , z.Stattdessen wäre eine minimale Version nur:
und Sie müssen nicht müssen den Inhalt importieren
object WeekDay
, aber dann würden Sie brauchen Typ zu verwendenWeekDay.Value
und die einzelnen Mitglieder zu qualifizieren. So würde das Beispiel werdenDie zweite Frage betrifft die Bedeutung von
val Mon, ... = Value
. Dies ist in der Tat sehr verwirrend, wenn Sie sich nicht mit der Implementierung von befassenEnumeration
. Dies ist nicht die Zuordnung eines Typs! Stattdessen wird eine geschützte Methode mit demselben Namen aufgerufenValue
, die eine konkrete Instanz vom Typ zurückgibtValue
.So kommt es , dass Sie schreiben können
val a, b, c = foo
in Scala, und für jeden Werta
,b
undc
das Verfahrenfoo
wird wieder und wieder aufgerufen werden.Enumeration
Mit diesem Trick wird ein interner Zähler so erhöht, dass jeder Wert individuell ist.Wenn Sie die Scala-API-Dokumente für öffnen
Enumeration
und auf klickenVisibility: All
, wird diese Methode angezeigt.quelle
Open(Mon, 8, 20)
und die Tage würden eine flache Aufzählung bleiben.