Menu
Coddy logo textTech

Индексные сигнатуры

Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 72 из 73.

Вы встречали типы карт, такие как {[string]: number}, в главе о таблицах — это сигнатура индекса: любой строковый ключ сопоставляется с числовым значением. Они отлично подходят, когда ключи неизвестны на этапе написания кода: счётчики, настройки, кэши, очки — всё, что формируется во время выполнения.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- любой строковый ключ разрешён
counts["sword"] = 1
counts["potion"] += 1  -- значения проверяются как числа

При работе с картами важны два факта во время выполнения. Во-первых, чтение ключа, который никогда не задавался, возвращает nil — классический паттерн подсчёта обрабатывает это с помощью or, превращая "отсутствие" в 0:

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

Во-вторых, pairs() обходит ключи карты без гарантированного порядка — при двух запусках одной и той же программы порядок обхода ключей может отличаться. Если вывод должен быть предсказуемым, соберите ключи в массив, отсортируйте их с помощью table.sort и затем итерируйте отсортированный массив:

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

Задание

Легко

Подсчитайте выпавшую добычу с помощью типизированной карты.

  • Объявите type Counts = {[string]: number}.
  • Напишите countItems(items: {string}): Counts, которая создает новую карту Counts, подсчитывая, сколько раз встречается каждая строка (используйте шаблон (counts[item] or 0) + 1).
  • Создайте local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} и подсчитайте элементы в ней.
  • Выведите по одной строке [name]: [count] для каждого уникального предмета в алфавитном порядке: соберите ключи (keys), отсортируйте их с помощью table.sort, а затем выведите.

Ожидаемый вывод:

potion: 3
shield: 1
sword: 2

Попробуйте сами

-- Напишите код здесь
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts используя (counts[item] or 0) + 1
-- 3) подсчитайте массив loot из задания
-- 4) соберите ключи, table.sort их, выведите строки `{name}: {count}`
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau