Добавление и удаление ключей
Словарь может меняться, пока работает программа. Значение меняют так же, как переменную, через =. А если присвоить значение ключу, которого в таблице ещё нет, Lua его добавит:
local barn = {carrot = 12, potato = 30}
barn.carrot = barn.carrot + 5
barn.eggs = 18
barn["sweet corn"] = 9
print(barn.carrot, barn.eggs, barn["sweet corn"])Выведется:
17 18 9Можно начать и с пустой таблицы, {}, и добавлять пары по одной: local barn = {}, затем barn.eggs = 18.
Каждый ключ встречается в таблице только один раз. Если присвоить значение ключу, который уже есть, его значение заменится; второй пары с таким же ключом не появится.
Когда вы читаете ключ, которого в таблице нет, это не ошибка: вы получаете nil, как и при индексе за концом списка. Ошибка возникает только тогда, когда вы пытаетесь вычислить что-то с этим nil:
local barn = {carrot = 12, potato = 30}
print(barn.pumpkin)
print(barn.pumpkin + 1)Выведется:
nil
main.lua:4: attempt to perform arithmetic on a nil value (field 'pumpkin')В сообщении написано field 'pumpkin': в сообщениях об ошибках Lua называет ключ таблицы полем (field). Опечатка заканчивается так же: barn.carot — тоже nil, без всякого предупреждения, потому что Lua не может знать, что вы имели в виду carrot. Важен и регистр букв: barn.Carrot — это другой ключ.
Если отсутствующий ключ должен считаться нулём, используйте or, как для значений по умолчанию в уроке про условия: barn.pumpkin or 0 равно 0, когда в амбаре нет тыкв, и их количеству, когда есть.
Чтобы удалить ключ, присвойте ему nil: barn.potato = nil. Для Lua ключ со значением nil и ключ, которого в таблице нет, — одно и то же, поэтому после этой строки картофеля в таблице больше нет.
И один сюрприз: # не считает пары словаря. Он считает только элементы списка, то есть ключи 1, 2, 3…:
local barn = {carrot = 12, potato = 30, pumpkin = 4}
print(#barn)0Как посчитать ключи, вы увидите в упражнении про pairs.
Задание
- 1
Программа заканчивается ошибкой: клубники в амбаре нет, поэтому
barn.strawberryравноnil. Эмма только что собрала 8 корзин клубники. Под комментарием-- Изменения вносите здесь:добавьте в таблицу ключstrawberryсо значением8(строку с фигурными скобками не трогайте). Тогда программа выведет:Морковь: 12 Клубника: 8 - 2
Эмма продала на рынке 5 морковок. Под строкой, которая добавляет клубнику, уменьшите количество моркови в таблице на 5. Первая строка тогда будет такой:
Морковь: 7 - 3
Дедушка Джо покупает весь картофель. Под строкой, которая меняет морковь, удалите из таблицы ключ
potato, присвоив емуnil. - 4
В конце программы выведите картофель. Его нет, поэтому используйте
or 0. Заключите это в скобки,(barn.potato or 0): без них Lua сначала выполнит.., и программа закончится ошибкой. Новая строка:Картофель: 0