Zamrażanie stałych tabel
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 59 z 80.
Stała tablica ma jedną słabość: nadal jest zwykłą tablicą. Dowolny kod, w dowolnym miejscu, może zapisać UserRole.Admin = 99, a twoje „stałe” po cichu przestaną być stałe.
Luau wypełnia tę lukę za pomocą table.freeze. Zamrożenie sprawia, że tablica jest tylko do odczytu w czasie działania: każda próba dodania, zmiany lub usunięcia pola powoduje błąd. Przyjęta praktyka polega na zamrożeniu tablicy od razu po jej utworzeniu: table.freeze zwraca tę samą tablicę, gotową do przypisania:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: odczyt działa jak zwykle
Color.Gold = 4 -- ✗ błąd: próba zmodyfikowania tabeli tylko do odczytuW przeciwieństwie do wszystkiego innego omówionego dotąd w tym kursie, jest to ochrona w czasie działania: rzeczywisty błąd pojawia się w chwili wykonania zapisu, a nie ostrzeżenie podczas edycji. Chroni nawet przed kodem, którego nie widział sprawdzacz typów.
Warto znać dwie powiązane funkcje: table.isfrozen(t) zwraca informację, czy tablica jest zamrożona, a zamrażanie jest płytkie: zagnieżdżone tablice pozostają modyfikowalne, chyba że je również zamrozisz. Nie można też cofnąć zamrożenia: raz zamrożona tablica pozostaje zamrożona.
Zamrożona tablica stałych w połączeniu z unią literałów używaną jako typ parametrów tworzy kompletny enum w Luau: nazwane wartości czasu działania, których nikt nie może zmienić, oraz sprawdzanie podczas edycji wszędzie tam, gdzie są używane.
Wyzwanie
ŁatwyUtwórz stałą tablicę, której nie da się zmienić.
- Utwórz
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Wyświetl
Size.Largeitable.isfrozen(Size). - Zapisz
pcall(function() Size.Huge = 4 end)wlocal oki wyświetlok.
Naciśnij Uruchom kod: wynik pokazuje 3, true i false.
Spróbuj swoich sił
-- 1) local Size = table.freeze({...})
-- 2) wypisz Size.Large oraz table.isfrozen(Size)
-- 3) zapisz w ok wartość zwróconą przez pcall przy niedozwolonym zapisie, a następnie ją wypisz
Wszystkie lekcje w sekcji Wprowadzenie do Luau
1Pierwsze kroki z Luau
Czym jest Luau?Dlaczego warto używać Luau?Twój pierwszy kod w LuauSprawdzanie typów i tryby błędówPodsumowanie: Wprowadzenie do Luau4Praca z funkcjami
Typowanie parametrów i wartości zwracanychTypowanie funkcji anonimowychFunkcje niezwracające wartościParametry opcjonalneDomyślne wartości parametrówWartości domyślne dla typów BooleanFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Podstawowe typy
Number, String i BooleanTyp 'any': wyjście awaryjneTyp 'unknown'Nil i typy opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenia z podstawowych typów5Aliasy, typy sumy i przekroju
Aliasy typów dla typów prostychTypy sumyPraca z typami sumyTypy literałoweTypy przekrojuŁączenie aliasów typówPodsumowanie: zaawansowane kombinacje typów8Enumy po luauowemu
Wzorzec enumów w LuauNumeryczne enumy z tabelamiEnumy tekstowe jako unieUżywanie enumów opartych na unii literałówZamrażanie stałych tabelPodsumowanie: enumy po luauowemu3Typowane tabele: tablice i mapy
Typowane tabliceDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie i uzyskiwanie dostępu do mapIterowanie po tabelachTabele o mieszanej strukturzeOdczytywanie siatkiTworzenie siatkitable.unpackPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online