Konstante Tables einfrieren
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy — Lektion 55 von 73.
Eine konstante Tabelle hat eine Schwachstelle: Sie ist immer noch eine gewöhnliche Tabelle. Jeder Code, überall, kann UserRole.Admin = 99 schreiben — und deine "Konstanten" hören stillschweigend 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, wirft einen Fehler auf. Die gängige Praxis ist es, die Tabelle direkt dort einzufrieren, wo sie erstellt wird — table.freeze gibt dieselbe Tabelle zurück, bereit zur Zuweisung:
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 in dem Moment, in dem der Schreibzugriff ausgeführt wird, nicht nur eine Warnung zur Bearbeitungszeit. Es schützt selbst vor Code, den die Typprüfung nie gesehen hat.
Zwei nützliche Begleiter: table.isfrozen(t) gibt zurück, ob eine Tabelle eingefroren ist, und das Einfrieren ist flach (shallow) — verschachtelte Tabellen bleiben veränderlich, außer du frierst sie ebenfalls ein. Du kannst das Einfrieren auch nicht rückgängig machen: Einmal eingefroren, bleibt eine Tabelle eingefroren.
Eine eingefrorene konstante Tabelle zusammen mit einer Literal-Union für Parameter ergibt das vollständige Luau-Enum: benannte Laufzeitwerte, die niemand manipulieren kann, und Prüfungen zur Bearbeitungszeit überall dort, wo sie verwendet werden.
Aufgabe
EinfachErstelle eine frozen Konstantentabelle namens Color — baue sie auf und friere sie in einem Schritt mit table.freeze ein — mit folgendem Inhalt:
Red=1Green=2Blue=3
Erstelle eine normale (nicht eingefrorene) Tabelle namens settings mit dem Feld volume = 5.
Gib jeweils in einer eigenen Zeile Folgendes aus:
Color.RedColor.Blue- ob
Coloreingefroren ist (table.isfrozen) - ob
settingseingefroren ist - das Ergebnis des Versuchs, ein Feld zu
Colorinnerhalb vonpcallhinzuzufügen — rufepcall(function() Color.Gold = 4 end)auf und gib den zurückgegebenenbooleanaus
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