Switch
Die switch-Anweisung ist eine Kurzform für eine Reihe von if-Anweisungen, die gegen denselben Wert prüfen. Der Wert wird nur einmal ausgewertet. Wie bei if kann switch einen else-Block haben, wenn keine Übereinstimmung gefunden wird. Verglichen wird mit dem Operator ==. In einer switch-Anweisung kannst du auch eine Zuweisung verwenden, um den temporären Wert zu speichern.
switch name := "Dan" when "Robert" print "Du bist Robert" when "Dan", "Daniel" print "Dein Name ist Dan" else print "Ich kenne dich nicht mit dem Namen #{name}"switch name := "Dan" when "Robert" print "Du bist Robert" when "Dan", "Daniel" print "Dein Name ist Dan" else print "Ich kenne dich nicht mit dem Namen #{name}"Eine when-Klausel kann mehrere Werte prüfen, indem sie kommasepariert aufgelistet werden.
switch kann auch als Ausdruck verwendet werden. Hier wird das Ergebnis der switch-Anweisung einer Variable zugewiesen:
b = 1next_number = switch b when 1 2 when 2 3 else error "so hoch kann ich nicht zählen!"b = 1next_number = switch b when 1 2 when 2 3 else error "so hoch kann ich nicht zählen!"Du kannst das Schlüsselwort then verwenden, um einen when-Block in einer Zeile zu schreiben. Für den else-Block braucht es kein zusätzliches Schlüsselwort.
msg = switch math.random(1, 5) when 1 then "Du hast Glück" when 2 then "Du hast fast Glück" else "nicht so viel Glück"msg = switch math.random(1, 5) when 1 then "Du hast Glück" when 2 then "Du hast fast Glück" else "nicht so viel Glück"Wenn du eine Einrückung weniger möchtest, kannst du die erste when-Klausel in die Startzeile der Anweisung setzen und alle weiteren Klauseln mit einer Einrückung weniger schreiben.
switch math.random(1, 5) when 1 print "Du hast Glück" -- zwei Einrückungen else print "nicht so viel Glück"
switch math.random(1, 5) when 1 print "Du hast Glück" -- eine Einrückungelse print "nicht so viel Glück"switch math.random(1, 5) when 1 print "Du hast Glück" -- zwei Einrückungen else print "nicht so viel Glück"
switch math.random(1, 5) when 1 print "Du hast Glück" -- eine Einrückungelse print "nicht so viel Glück"Beachte die Reihenfolge des Case-Vergleichsausdrucks. Der Case-Ausdruck steht auf der linken Seite. Das kann nützlich sein, wenn der Case-Ausdruck die Vergleichslogik über eine __eq-Metamethod selbst definiert.
Tabellen-Matching
Abschnitt betitelt „Tabellen-Matching“Du kannst in einer switch-when-Klausel Tabellen-Matching verwenden, wenn die Tabelle durch eine bestimmte Struktur destrukturiert werden kann und dabei nicht-nil-Werte liefert.
items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "Größe #{width}, #{height}"items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "Größe #{width}, #{height}"Du kannst Standardwerte verwenden, um bestimmte Felder optional zu destrukturieren.
item = {}
{pos: {:x = 50, :y = 200}} = item -- Fehler: Versuch, einen nil-Wert zu indexieren (Feld 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdemitem = {}
{pos: {:x = 50, :y = 200}} = item -- Fehler: Versuch, einen nil-Wert zu indexieren (Feld 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdemDu kannst auch gegen Array-Elemente, Tabellenfelder und sogar verschachtelte Strukturen mit Array- oder Tabellenliteralen matchen.
Matchen gegen Array-Elemente.
switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b hat einen Standardwert print "1, 2, #{b}"switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b hat einen Standardwert print "1, 2, #{b}"Matchen gegen Tabellenfelder mit Destructuring.
switch tb when success: true, :result print "Erfolg", result when success: false print "fehlgeschlagen", result else print "ungültig"switch tb when success: true, :result print "Erfolg", result when success: false print "fehlgeschlagen", result else print "ungültig"Matchen gegen verschachtelte Tabellenstrukturen.
switch tb when data: {type: "success", :content} print "Erfolg", content when data: {type: "error", :content} print "fehlgeschlagen", content else print "ungültig"switch tb when data: {type: "success", :content} print "Erfolg", content when data: {type: "error", :content} print "fehlgeschlagen", content else print "ungültig"Matchen gegen Array von Tabellen.
switch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "getroffen", fourthswitch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "getroffen", fourthMatchen gegen eine Liste und einen Bereich von Elementen erfassen.
segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Gruppe:", groups -- gibt aus: {"admin", "users"} print "Ressource:", resource -- gibt aus: "logs" print "Aktion:", action -- gibt aus: "view"segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Gruppe:", groups -- gibt aus: {"admin", "users"} print "Ressource:", resource -- gibt aus: "logs" print "Aktion:", action -- gibt aus: "view"