Вставка и удаление
В Lua есть набор функций для работы со списками. Их имена начинаются с table., как имена математических функций начинаются с math.. Две самые нужные — table.insert и table.remove.
table.insert(list, value) добавляет значение в конец списка. Это то же самое, что list[#list + 1] = value, но читается легче. С тремя значениями в скобках, table.insert(list, position, value), значение встаёт на указанную позицию. Элементы, начиная с неё, сдвигаются на одно место вправо, и их индексы увеличиваются на единицу:
local tasks = {"покормить кур", "полить поле"}
table.insert(tasks, "подоить Беллу")
table.insert(tasks, 1, "выпустить Рекса")
print(#tasks)
print(tasks[1])
print(tasks[2])
print(tasks[4])Выведется:
4
выпустить Рекса
покормить кур
подоить БеллуПозиция стоит перед значением. Если поменять их местами, как в table.insert(tasks, "подоить Беллу", 1), программа остановится с ошибкой bad argument #2 to 'insert' (number expected, got string): второе значение в скобках (второй аргумент) должно быть числом. Позиция должна лежать между 1 и #tasks + 1. Любая другая, например table.insert(tasks, 10, "отдохнуть"), заканчивается ошибкой bad argument #2 to 'insert' (position out of bounds). Так table.insert никогда не оставляет дыр.
table.remove(list) удаляет последний элемент, а table.remove(list, position) — элемент на указанной позиции. Элементы после него сдвигаются на одно место влево, так что дыры не остаётся. Обе формы ещё и отдают удалённый элемент. Говорят, что они возвращают его, как math.floor возвращает округлённое число. Его можно сохранить в переменной:
local tasks = {"выпустить Рекса", "покормить кур", "подоить Беллу", "полить поле"}
local done = table.remove(tasks, 1)
print("Сделано: " .. done)
print("Дальше: " .. tasks[1])
local later = table.remove(tasks)
print("Завтра: " .. later)
print("Осталось: " .. #tasks)Выведется:
Сделано: выпустить Рекса
Дальше: покормить кур
Завтра: полить поле
Осталось: 2После первого table.remove элемент "покормить кур" переехал с индекса 2 на индекс 1. Если удалённый элемент не нужен, просто напишите table.remove(tasks, 1) на отдельной строке. Удаление из пустого списка — не ошибка: ничего не удаляется, а вы получаете nil.
Сравните с tasks[1] = nil. Это лишь очищает первое место и оставляет в начале списка дыру: tasks[1] становится nil, а "Дальше: " .. tasks[1] заканчивается ошибкой attempt to concatenate a nil value. Чтобы удалить элемент, используйте table.remove.
Задание
- 1
Рекс скребётся в дверь. Ниже
printвставьте"выпустить Рекса"в начало списка, на позицию 1, с помощьюtable.insert. - 2
Дедушка Джо попросил Эмму помочь ему с забором. Добавьте
"помочь дедушке Джо"в конец списка с помощьюtable.insert. - 3
Эмма выпустила Рекса. Удалите первую задачу из списка с помощью
table.remove, сохраните её в локальной переменнойdoneи выведите:Сделано: выпустить Рекса. - 4
Наконец, выведите число задач, первую задачу и последнюю:
Задач: 4 Первая: покормить кур Последняя: помочь дедушке Джо