Menu
CoddyTech

Używanie enumów opartych na unii literałów

Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 58 z 80.

Unie literałów sprawdzają się szczególnie dobrze jako parametry funkcji. Określ typ parametru za pomocą unii, a weryfikator typów zagwarantuje, że funkcja będzie wywoływana wyłącznie z prawidłowym elementem:

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 elementy 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 gałęzi 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 przychodzące z zewnątrz, na przykład z io.read(), są typowane jako zwykły string, ponieważ weryfikator nie może wiedzieć, co wpisze użytkownik. Operator rzutowania Luau :: rozwiązuje ten problem: value :: Type informuje weryfikator, by traktował wartość jako ten typ. Lekcja Asercje typów pod koniec tej sekcji omawia rzutowania w całości; na razie wystarczy jedna linijka:

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 należałoby je zweryfikować; tutaj rzutowanie pozwala funkcjom z określonymi typami poprawnie przyjmować dane od użytkownika.

challenge icon

Wyzwanie

Łatwy

Zamień kierunek wpisany przez gracza na akcję.

  1. Zapisz type Direction = "up" | "down" | "left" | "right".
  2. Zapisz funkcję local function getAction(direction: Direction): string, która zwraca "Climb", "Drop", "Turn left" lub "Turn right".
  3. Odczytaj local direction = io.read() :: Direction i wyświetl getAction(direction).

Naciśnij Run Code: po wprowadzeniu up na wyjściu pojawi się Climb.

Spróbuj swoich sił

-- 1) typ Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, a następnie wypisz akcję

Wszystkie lekcje w sekcji Wprowadzenie do Luau

Poćwicz samodzielnie: Kompilator Luau online