Длина списка
Оператор # вам знаком по строкам: #"carrot" равно 6, длине строки. Поставьте его перед списком, и он даст число элементов — длину списка:
local crops = {"морковь", "картофель", "тыква"}
print(#crops)
print("Культур: " .. #crops)
print(#{})Выведется:
3
Культур: 3
0У пустого списка длина 0. # даёт обычное число, поэтому с ним можно считать: #crops + 1 равно 4. Только не путайте #crops и #crops[1]. Второе — длина первого элемента, строки "морковь": 14 байт, ведь каждая русская буква занимает два байта.
Длина показывает и то, где лежит последний элемент. Индексы идут от 1 до числа элементов, значит, последний индекс равен самой длине: в списке из 3 элементов индексы 1, 2 и 3. Последний элемент — crops[#crops]:
local crops = {"морковь", "картофель", "тыква"}
print(crops[#crops])
print(crops[#crops - 1])Выведется:
тыква
картофельСначала Lua вычисляет индекс в квадратных скобках (#crops равно 3, а 3 − 1 равно 2), а потом читает элемент с этим индексом. Так что crops[#crops - 1] — предпоследний элемент.
Почему бы просто не написать crops[3]? Потому что списки меняются. В следующих упражнениях вы будете добавлять и удалять элементы, а программы часто работают со списками любой длины, которые сами не создавали. crops[#crops] — всегда последний элемент, каким бы длинным ни был список. А с crops[3] программа продолжала бы выводить третью культуру, даже когда Эмма посадит четвёртую.
Частая ошибка — шагнуть слишком далеко. crops[#crops + 1] — это место сразу после последнего элемента, где пока ничего нет:
local crops = {"морковь", "картофель", "тыква"}
print("Последняя культура: " .. crops[#crops + 1])main.lua:2: attempt to concatenate a nil value (field '?')На этот раз в сообщении написано field '?'. Lua описывает индекс, только если он записан в коде числом; здесь его пришлось сначала вычислить. Зато место #crops + 1 ещё пригодится: в следующем упражнении вы добавите новый элемент именно туда.
Задание
- 1
Ниже
printвыведите число мешков с семенами в списке с помощью#:Мешков: 5. - 2
Создайте локальную переменную
lastс последним элементомseeds. Получите его через#, а не через число5. - 3
Выведите его:
Последний: пшеница. - 4
Наконец, выведите предпоследний мешок тем же способом, через
#seeds - 1:Предпоследний: клубника.