Ключи и значения
В уроке про списки таблица хранила элементы по порядку, под номерами 1, 2, 3… Для списка покупок это удобно. Но Эмма хочет записать, что лежит у неё в амбаре: 12 морковок, 30 картофелин и 4 тыквы. Список {12, 30, 4} хранил бы числа, но по нему не понять, какое число к какой культуре относится.
Таблица умеет больше, чем список. Вместо номеров 1, 2, 3 она может использовать названия:
-- Амбар Эммы
local barn = {carrot = 12, potato = 30, pumpkin = 4}
print(barn.carrot)
print(barn["potato"])Выведется:
12
30Такая таблица называется словарём, или таблицей «ключ—значение». Как в настоящем словаре вы ищете слово, чтобы узнать его значение, так здесь вы ищете ключ (carrot), чтобы найти его значение (12). В фигурных скобках записаны пары «ключ—значение» через запятую: ключ, = и значение. Значением может быть что угодно: число, строка, true или false, даже другая таблица.
Отдельного типа для словарей в Lua нет. Это та же таблица, которую вы знаете по спискам, и type(barn) — это "table". Список — просто таблица, у которой ключи 1, 2, 3…
Прочитать значение можно двумя способами, и значат они одно и то же:
barn.carrot: точка и название ключа;barn["carrot"]: ключ как строка в квадратных скобках, как индекс в списке.
Точка короче, поэтому встречается чаще. Но работает она только для ключей, которые подходят под правила имён переменных: буквы, цифры и _, имя не начинается с цифры и не является ключевым словом вроде end. Ключ с пробелом, например sweet corn, нужно записывать в квадратных скобках и в кавычках, и в фигурных скобках, и когда вы его читаете:
local barn = {carrot = 12, ["sweet corn"] = 9}
print(barn["sweet corn"])Выведется:
9Без скобок Lua прочитает только sweet и не поймёт, что делать с corn: {sweet corn = 9} заканчивается ошибкой main.lua:1: '}' expected near 'corn'.
Таблицу с большим числом пар удобнее читать, когда каждая пара стоит на своей строке. Запятая после последней пары разрешена — это пригодится, когда вы потом добавите ещё одну строку:
local carrot = {
name = "Морковь",
days = 3,
sellPrice = 5,
}
print(carrot.name .. " продаётся за " .. carrot.sellPrice .. " монет")Выведется:
Морковь продаётся за 5 монетЧтобы увидеть словарь целиком, print(barn) не поможет: как и со списками, он выведет только table: 0x…. А table.concat склеивает только элементы списка. Как вывести каждую пару, вы узнаете позже в этом уроке.
Типичные ошибки:
- Пропущена запятая между двумя парами:
{carrot = 12 potato = 30}заканчивается ошибкойmain.lua:1: '}' expected near 'potato'. - Двоеточие вместо
=, как пишут в некоторых других языках:{carrot: 12}заканчивается ошибкойmain.lua:1: <name> expected near '12'. - Ключ в кавычках, но без квадратных скобок:
{"carrot" = 12}заканчивается ошибкойmain.lua:1: '}' expected near '='.
Задание
- 1
Выведите, сколько в амбаре моркови и картофеля. Числа берите из таблицы: одно через точку, другое через квадратные скобки. Программа выводит:
Морковь: 12 Картофель: 30 - 2
Эмма собрала 9 початков сладкой кукурузы. В фигурных скобках добавьте пару с ключом
"sweet corn"и значением9. В ключе есть пробел, поэтому нужны квадратные скобки. - 3
В конце программы выведите сладкую кукурузу и общую сумму всех трёх культур. Все числа читайте из таблицы:
Сладкая кукуруза: 9 Итого: 51