Menu
CoddyTech

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 odczytu

W 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.

challenge icon

Wyzwanie

Łatwy

Utwórz stałą tablicę, której nie da się zmienić.

  1. Utwórz local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. Wyświetl Size.Large i table.isfrozen(Size).
  3. Zapisz pcall(function() Size.Huge = 4 end) w local ok i wyświetl ok.

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

Poćwicz samodzielnie: Kompilator Luau online