Menu
Coddy logo textTech

Sygnatury indeksowe

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

Typy map, takie jak {[string]: number}, poznasz już w rozdziale o tabelach: sygnatura indeksu: każdy klucz typu string mapuje na wartość typu number. Sprawdzają się świetnie, gdy podczas pisania kodu nie znasz kluczy: liczniki, ustawienia, pamięci podręczne, wyniki — wszystko, co gromadzi się w czasie działania programu.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- dozwolony jest dowolny klucz typu string
counts["sword"] = 1
counts["potion"] += 1  -- wartości są sprawdzane jako liczby

Podczas pracy z mapami ważne są dwa fakty dotyczące działania programu. Po pierwsze, odczytanie klucza, któremu nigdy nie przypisano wartości, zwraca nil: klasyczny wzorzec zliczania obsługuje to za pomocą or, zamieniając „brak” na 0:

counts[item] = (counts[item] or 0) + 1

Po drugie, pairs() iteruje po kluczach mapy w nieokreślonej kolejności: dwukrotne uruchomienie tego samego programu może odwiedzić klucze w innej kolejności. Gdy wynik musi być przewidywalny, zbierz klucze do tablicy, posortuj je za pomocą table.sort i zamiast tego iteruj po posortowanej tablicy:

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

Wyzwanie

Łatwy

Policz łupy za pomocą typowanej mapy.

  • Zadeklaruj type Counts = {[string]: number}.
  • Napisz countItems(items: {string}): Counts, która tworzy nową mapę typu Counts, zliczając, ile razy występuje każdy ciąg znaków (użyj wzorca (counts[item] or 0) + 1).
  • Utwórz local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} i zlicz elementy.
  • Wypisz po jednym wierszu [name]: [count] dla każdego unikalnego przedmiotu, w kolejności alfabetycznej: zbierz klucze, posortuj je za pomocą table.sort, a następnie wypisz.

Oczekiwany wynik:

potion: 3
shield: 1
sword: 2

Spróbuj swoich sił

-- Napisz kod tutaj
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts z użyciem (counts[item] or 0) + 1
-- 3) policz elementy tablicy loot z zadania
-- 4) zbierz klucze, posortuj je za pomocą table.sort i wypisz wiersze `{name}: {count}`
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