Индексные сигнатуры
Часть раздела Введение в 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Задание
ЛегкоПодсчитайте выпавшую добычу с помощью типизированной карты.
- Объявите
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}`
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари