Konstante Tables einfrieren
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 55 von 73.
Eine Konstantentabelle hat eine Schwäche: Sie ist immer noch eine gewöhnliche Tabelle. Jeder beliebige Code kann UserRole.Admin = 99 schreiben, und deine „Konstanten“ hören unbemerkt auf, konstant zu sein.
Luau schließt diese Lücke mit table.freeze. Das Einfrieren macht eine Tabelle zur Laufzeit schreibgeschützt: Jeder Versuch, ein Feld hinzuzufügen, zu ändern oder zu entfernen, löst einen Fehler aus. Das gängige Muster besteht darin, die Tabelle direkt beim Erstellen einzufrieren: table.freeze gibt dieselbe Tabelle zurück, die sofort zugewiesen werden kann:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: Lesen funktioniert wie gewohnt
Color.Gold = 4 -- ✗ Fehler: Versuch, eine schreibgeschützte Tabelle zu ändernIm Gegensatz zu allem anderen in diesem Kurs bisher ist dies ein Schutz zur Laufzeit: ein echter Fehler genau in dem Moment, in dem der Schreibvorgang ausgeführt wird, und keine Warnung zur Bearbeitungszeit. Er schützt sogar vor Code, den der Typprüfer nie gesehen hat.
Zwei nützliche Begleiter: table.isfrozen(t) gibt zurück, ob eine Tabelle eingefroren ist, und das Einfrieren ist oberflächlich: Verschachtelte Tabellen bleiben veränderbar, sofern du sie nicht ebenfalls einfrierst. Du kannst eine Tabelle außerdem nicht wieder auftauen: Sobald sie eingefroren ist, bleibt sie eingefroren.
Eine eingefrorene Konstantentabelle zusammen mit einer Literalkombination für Parameter ist das vollständige Luau-Enum: benannte Laufzeitwerte, an denen niemand herumpfuschen kann, und eine Prüfung zur Bearbeitungszeit überall dort, wo sie verwendet werden.
Aufgabe
EinfachErstelle eine schreibgeschützte Konstantentabelle namens Color, erstelle sie und friere sie mit table.freeze in einem Schritt ein. Sie soll Folgendes enthalten:
Red=1Green=2Blue=3
Erstelle eine einfache (nicht schreibgeschützte) Tabelle namens settings mit einem Feld volume = 5.
Gib jeweils in einer eigenen Zeile Folgendes aus:
Color.RedColor.Blue- ob
Colorschreibgeschützt ist (table.isfrozen) - ob
settingsschreibgeschützt ist - das Ergebnis des Versuchs, innerhalb von
pcallein Feld zuColorhinzuzufügen: Rufepcall(function() Color.Gold = 4 end)auf und gib den zurückgegebenen booleschen Wert aus
Probier es selbst
-- Schreibe Code hier
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, beide isfrozen-Ergebnisse
-- 4) pcall den verbotenen Schreibvorgang und print den zurückgegebenen Boolean
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