Menu
CoddyTech

Сигнатуры индексов

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

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

type Counts = {[string]: number}

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

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

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

Во-вторых, pairs() перебирает ключи map в неопределённом порядке: при двух запусках одной и той же программы ключи могут посещаться в разном порядке. Если результат должен быть предсказуемым, собери ключи в массив, отсортируй их с помощью 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

Задание

Легко

Храните очки игроков, имена которых вы заранее не знаете.

  1. Напишите type Scores = {[string]: number} и создайте local scores: Scores = {}.
  2. Добавьте очки: scores["mia"] = (scores["mia"] or 0) + 5, затем то же самое для "leo" с 3.
  3. Выведите scores["mia"], scores["leo"] и scores["zed"].

Нажмите «Играть»: в выводе будут показаны 5, 3 и nil.

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

-- 1) type Scores = {[string]: number}, затем local scores: Scores = {}
-- 2) добавьте 5 очков для "mia" и 3 для "leo"
-- 3) выведите mia, leo и zed

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

Потренируйтесь самостоятельно: Онлайн-компилятор Luau