Menu

Zero Enums: Einfache Aufzählungen ohne Payloads

Wie enum in Zero funktioniert: eine feste Menge benannter Varianten deklarieren, Werte vergleichen und die Grenze zwischen enum (reine Tags) und choice (Tagged Unions).

Diese Seite enthält ausführbare Editoren — bearbeiten, ausführen und Ausgabe sofort sehen.

Ein Enum deklarieren

enum deklariert einen Typ, dessen Werte eine feste Menge benannter Varianten sind:

enum Status {
    ready,
    failed,
}

Jetzt ist Status ein Typ mit genau zwei Werten: Status.ready und Status.failed. Nichts anderes kann ein Status sein.

Die Grammatik ist absichtlich winzig:

  • enum Name { öffnet die Deklaration.
  • Jede Zeile listet einen Variantennamen, kommagetrennt.
  • } schließt sie.

Keine Payloads, keine Diskriminator-Werte, keine abgeleiteten Methoden – das hält enum zum „kleinen Summentyp" in Zero.

Ein Enum verwenden

Du benennst eine Variante, indem du sie mit dem Enum-Typ qualifizierst:

let state: Status = Status.ready

Die Annotation : Status ist optional, sobald die rechte Seite den Typ festnagelt; in den meisten Fällen kannst du schreiben:

let state = Status.ready

und der Compiler inferiert den Typ als Status.

Enum-Werte vergleichen

Zwei Enum-Werte sind gleich, wenn sie dieselbe Variante sind:

if state == Status.ready {
    check world.out.write("ready\n")
} else {
    check world.out.write("not ready\n")
}

Das ist der einfachste Weg, auf einem Enum zu verzweigen. Für erschöpfende Analyse – jede Variante explizit behandeln – greif zu match:

match state {
    .ready  => { check world.out.write("ready\n") }
    .failed => { check world.out.write("failed\n") }
}

Die Vorteile von match gegenüber if/else if zeigen sich, sobald du später eine dritte Variante hinzufügst. Der Compiler sagt dir jedes match, dem der neue Fall fehlt; eine if/else-Kette fällt stillschweigend in ihren Default-Zweig.

Choice und match behandelt match ausführlicher. Es funktioniert sowohl für enum als auch für choice.

Ein durchgespieltes Beispiel

Das offizielle Zero-Sample stellt enum und choice nebeneinander in derselben Datei vor:

Status tut in diesem Snippet nichts – es ist nur da, um den Kontrast zu zeigen. Eine choice-Variante bindet beim Matchen einen Payload (value, message); eine enum-Variante bindet nichts, weil es nichts zu binden gibt.

Enum vs. Choice: ein kurzer Entscheidungsbaum

Eine kurze Regel:

  • Die Varianten sind nur Labelsenum.
  • Die Varianten müssen Daten tragenchoice.

Modellierst du Lebenszyklus-Zustände und musst irgendwann eine Fehlermeldung an den „failed"-Zustand hängen, wechsle den Typ von enum zu choice. Die Varianten bekommen je einen Payload-Typ, und die nachgelagerten match-Zweige gewinnen ein Binding für diesen Payload. Es ist ein Refactor, durch den der Compiler dich führt.

Konkret:

// Vorher – enum, keine Payloads
enum Status {
    ready,
    failed,
}

// Nachher – choice mit Payloads auf jeder Variante
choice Status {
    ready: Void,
    failed: String,
}

Varianten mit Payload Void sind in der choice-Form auch nur Labels. Du kannst enum und choice für dieselben logischen Zustände nutzen; nimm enum, wenn du wirklich keine Daten dranhängen willst.

Einsatzfälle

Ein paar alltägliche Beispiele, wo enum die richtige Antwort ist:

  • Lebenszyklus ohne Metadaten. Loading, Ready, Empty – reine Zustände, keine Payloads.
  • Modi. Read, Write, Append für einen Datei-Öffnungs-Modus.
  • Richtung. North, South, East, West.
  • Log-Level. Trace, Debug, Info, Warn, Error. (Vielleicht hängst du später eine Nachricht dran, und dann wechselst du zu choice.)
  • Wochentag. Ein kanonisches Beispiel.

Immer wenn du sonst zu einer magischen Integer-Konstante greifen würdest (0 = pending, 1 = active, 2 = done), ist ein enum fast immer klarer.

Stil-Hinweise

  • Kleingeschriebene Variantennamen passen zu Zeros Stil für Bezeichner im Rest der Sprache.
  • Ein abschließendes Komma nach der letzten Variante ist okay (und empfohlen für diff-Freundlichkeit – eine neue Variante hinzuzufügen rührt die vorherige Zeile nicht an).
  • Halte Enum-Listen klein. Hast du ein Dutzend Varianten und viele davon wollen Payloads, schaust du eher auf eine choice – oder ein Redesign – statt auf ein größeres enum.

Als Nächstes: Choice und Match

Der natürliche nächste Schritt ist der reichhaltigere Verwandte: choice und match – Zeros Tagged-Union-Typ und das dazugehörige Pattern-Matching-Konstrukt.

Häufig gestellte Fragen

Was ist ein enum in Zero?

Ein enum deklariert einen Typ, dessen Werte einer von einer festen Menge benannter Varianten sind – Labels ohne extra Payload. Beispiel: enum Status { ready, failed }. Ein Wert vom Typ Status ist genau eines von Status.ready oder Status.failed, und der Compiler erzwingt das.

Wie unterscheidet sich enum von choice?

Die Varianten eines enum sind reine Labels – sie tragen keine Daten. Ein choice ist eine Tagged Union – jede Variante hat einen zugeordneten Payload-Typ, etwa choice Result { ok: i32, err: String }. Nimm enum, wenn du Fälle nur über Namen unterscheiden willst; nimm choice, wenn jeder Fall extra Informationen trägt.

Wie prüfe ich, welche enum-Variante ein Wert hat?

Vergleiche den Wert mit der Variante: if status == Status.ready { ... }. Für erschöpfende Verzweigung über alle Varianten nutze match – der Compiler warnt, wenn du eine Variante übergehst, was der Hauptgrund ist, match gegenüber if/else if-Ketten zu bevorzugen, wenn der Wert ein Summentyp ist.

Können enum-Varianten in Zero zugeordnete Werte haben?

Nein – dafür gibt es choice. enum ist bewusst der minimale Summentyp: jede Variante ist nur ein Label. Wenn du an eine der Varianten einen i32 oder einen String anhängen willst, bist du aus enum herausgewachsen und willst eine choice.

Wann sollte man in Zero ein enum verwenden?

Verwende enum, wenn ein Wert genau einer aus einer kleinen, benannten Menge von Zuständen sein muss und diese Zustände keine extra Daten tragen. Beispiele: Wochentag, Ampelfarbe, Lebenszyklus-Zustand ohne Metadaten, ein Logging-Level. Wenn du an eine der Varianten Daten hängen willst, wechsle zu choice.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S