Menu
Coddy logo textTech

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 Direction

Wewną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
end

Jest 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() :: Direction

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

challenge icon

Wyzwanie

Łatwy

Utwó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:

  1. wywołaj funkcję move z kierunkiem
  2. wyświetl wynik funkcji getMovementDescription dla 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
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Wprowadzenie do Luau

Poćwicz samodzielnie: Kompilator Luau online