Zamrażanie stałych tabel
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 55 z 73.
Tablica stałych ma jedną wadę: wciąż jest zwykłą tablicą. Dowolny kod, w dowolnym miejscu, może przypisać UserRole.Admin = 99, a Twoje „stałe” po cichu przestaną być stałe.
Luau rozwiązuje ten problem za pomocą table.freeze. Zamrożenie sprawia, że tablica jest tylko do odczytu w czasie działania programu: 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, co do tej pory pojawiło się w tym kursie, jest to ochrona w czasie działania programu: rzeczywisty błąd występuje w chwili wykonania przypisania, a nie ostrzeżenie podczas edycji. Chroni nawet przed kodem, którego nie widział sprawdzacz typów.
Warto znać też dwie powiązane funkcje: table.isfrozen(t) zwraca informację, czy tablica jest zamrożona, a zamrożenie 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 wraz z unią literałów dla parametrów tworzy kompletny enum w Luau: nazwane wartości dostępne w czasie działania programu, których nikt nie może zmienić, oraz sprawdzanie podczas edycji wszędzie tam, gdzie są używane.
Wyzwanie
ŁatwyUtwórz zamrożoną stałą tablicę o nazwie Color, tworząc ją i zamrażając w jednym kroku za pomocą table.freeze, zawierającą:
Red=1Green=2Blue=3
Utwórz zwykłą (niezamrożoną) tablicę o nazwie settings z polem volume = 5.
Wypisz, każdą wartość w osobnym wierszu:
Color.RedColor.Blue- czy
Colorjest zamrożona (table.isfrozen) - czy
settingsjest zamrożona - wynik próby dodania pola do
Colorwewnątrzpcall: wywołajpcall(function() Color.Gold = 4 end)i wypisz zwróconą wartość logiczną
Spróbuj swoich sił
-- Napisz kod tutaj
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) wypisz Color.Red, Color.Blue oraz oba wyniki isfrozen
-- 4) użyj pcall do próby niedozwolonego zapisu i wypisz zwróconą wartość logiczną
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 niczego nie zwracająceParametry opcjonalneDomyślne wartości parametrówFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Typy podstawowe
Typy podstawowe: num, str, boolTyp „any”: furtka awaryjnaTyp „unknown”Typy Nil i opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenie typów podstawowych5Aliasy, 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
Tablice typowaneDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie map i dostęp do nichIterowanie po tabelachTabele o mieszanej strukturzeWielowymiarowe tablice typowanetable.unpack i varargsPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online