Сигнатуры индексов
Часть раздела Введение в 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Задание
ЛегкоХраните очки игроков, имена которых вы заранее не знаете.
- Напишите
type Scores = {[string]: number}и создайтеlocal scores: Scores = {}. - Добавьте очки:
scores["mia"] = (scores["mia"] or 0) + 5, затем то же самое для"leo"с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
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображенияПотренируйтесь самостоятельно: Онлайн-компилятор Luau