Używanie enumów opartych na unii literałów
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 54 z 73.
Unie literałów najlepiej sprawdzają się jako parametry funkcji. Określ typ parametru za pomocą unii, a kontroler typów zagwarantuje, że funkcja będzie wywoływana wyłącznie z prawidłową wartością z tej unii:
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ błąd typu: to nie jest DirectionWewnątrz funkcji obsłuż wszystkie wartości wyczerpująco, używając łańcucha if/elseif. Ponieważ typ ogranicza dane wejściowe do czterech wartości, sprawdzenie trzech z nich i pozostawienie ostatniej dla else obejmuje wszystkie możliwości:
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
endJest tu jeden haczyk: ciągi znaków pochodzące z zewnątrz, na przykład io.read(), mają zwykły typ string, ponieważ kontroler typów nie może wiedzieć, co wpisze użytkownik. Poznane wcześniej rzutowanie :: informuje go, aby traktował wartość jako typ wyliczeniowy:
local direction = io.read() :: DirectionRzutowanie to obietnica, a nie sprawdzenie — w czasie działania nic nie weryfikuje danych wejściowych. W kodzie produkcyjnym najpierw przeprowadzono by walidację; tutaj rzutowanie pozwala funkcjom z określonym typem bezproblemowo przyjmować dane od użytkownika.
Wyzwanie
ŁatwyUtwórz typ unii literałów Direction z elementami "up", "down", "left" i "right".
Utwórz funkcję move, która przyjmuje direction: Direction i wyświetla Moving [direction]...
Utwórz funkcję getMovementDescription, która przyjmuje direction: Direction, zwraca wartość typu string i obsługuje każdy element za pomocą if/elseif/else:
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
Odczytaj jeden wiersz od użytkownika za pomocą io.read() i rzutuj go na typ Direction za pomocą ::. Następnie:
- wywołaj funkcję
movez kierunkiem - wyświetl wynik funkcji
getMovementDescriptiondla tego samego kierunku
Spróbuj swoich sił
-- Napisz kod tutaj
-- 1) zdefiniuj typ Direction
-- 2) napisz move i getMovementDescription (if/elseif/else)
-- 3) odczytaj dane wejściowe: local direction = io.read() :: Direction
-- 4) wywołaj move, a następnie wypisz opis
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