Verwendung von Literal Union Enums
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 54 von 73.
Literal-Unionen bewähren sich als Funktionsparameter. Typisiere einen Parameter mit der Union, und der Checker garantiert, dass die Funktion immer nur mit einem gültigen Mitglied aufgerufen wird:
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ type error: not a DirectionBehandle die Mitglieder innerhalb der Funktion erschöpfend mit einer if/elseif-Kette. Da der Typ die Eingabe auf vier Werte begrenzt, deckt die Prüfung von drei Werten zusammen mit else für den letzten Wert alles ab:
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
endEine Besonderheit: Zeichenketten, die von außerhalb kommen, etwa von io.read(), werden als einfache string typisiert, weil der Checker nicht wissen kann, was ein Benutzer eingeben wird. Der zuvor gelernte ::-Cast weist ihn an, den Wert als deinen Enum-Typ zu behandeln:
local direction = io.read() :: DirectionEin Cast ist ein Versprechen, keine Prüfung; zur Laufzeit überprüft nichts die Eingabe. Produktionscode würde zunächst validieren; hier ermöglicht er es typisierten Funktionen, Benutzereingaben problemlos zu akzeptieren.
Aufgabe
EinfachErstelle den Literal-Union-Typ Direction mit den Mitgliedern "up", "down", "left" und "right".
Erstelle eine Funktion move, die direction: Direction entgegennimmt und Moving [direction]... ausgibt.
Erstelle eine Funktion getMovementDescription, die direction: Direction entgegennimmt, einen string zurückgibt und jedes Mitglied mit if/elseif/else behandelt:
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
Lies mit io.read() eine Zeile vom Benutzer ein und wandle sie mit Direction in :: um. Dann:
- Rufe
movemit der Richtung auf. - Gib das Ergebnis von
getMovementDescriptionfür dieselbe Richtung aus.
Probier es selbst
-- Schreibe den Code hier
-- 1) definiere den Typ Direction
-- 2) schreibe move und getMovementDescription (if/elseif/else)
-- 3) lies die Eingabe: local direction = io.read() :: Direction
-- 4) rufe move auf, dann gib die Beschreibung aus
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Einführung in Luau
1Erste Schritte mit Luau
Was ist Luau?Warum Luau nutzen?Dein erster Luau-CodeTypprüfung & FehlermodiZusammenfassung: Einführung in Luau4Arbeiten mit Funktionen
Typisierung von Parametern & RückgabewertenTypisierung von anonymen FunktionenFunktionen ohne RückgabewertOptionale ParameterStandard-ParameterwerteVariadische FunktionenDefinieren von FunktionstypenZusammenfassung: Typisierte Funktionen2Grundtypen
Grundlegende Typen: num, str, boolDer Typ 'any': Der AuswegDer Typ 'unknown'Nil- & optionale TypenTypinferenz in der PraxisExplizite TypannotationenZusammenfassung: Praxis zu Grundtypen5Typ-Aliase, Union-Typen und Schnittmengen-Typen
Typ-Aliase für PrimitivenUnion-TypenArbeiten mit Union-TypenLiterale TypenSchnittmengen-Typen (Intersection Types)Kombination von Typ-AliasenZusammenfassung: Fortgeschrittene Typ-Kombinationen8Enums auf die Luau-Art
Das Enum-Pattern in LuauNumerische Enums mit TablesString-Enums als UnionsVerwendung von Literal Union EnumsKonstante Tables einfrierenZusammenfassung: Enums auf die Luau-Art3Typisierte Tabellen: Arrays & Maps
Typisierte ArraysHinzufügen und Lesen von ElementenWas ist ein Map-Typ?Deklarieren und Zugreifen auf MapsIterieren von TabellenGemischt-strukturierte TabellenMehrdimensionale typisierte Arraystable.unpack und VarargsZusammenfassung: Arrays und MapsÜbe selbstständig: Online-Lua-Compiler