Перебор списка
До сих пор вы записывали индексы числами: crops[1], crops[2]. Но индексом может быть и переменная. Если i равно 2, то crops[i] — то же самое, что crops[2]. А цикл for может провести i по всем индексам, от 1 до длины списка:
local crops = {"морковь", "картофель", "тыква"}
for i = 1, #crops do
print(i .. ". " .. crops[i])
endВыведется:
1. морковь
2. картофель
3. тыкваВ первой итерации i равно 1, и цикл выводит crops[1]. Во второй итерации он выводит crops[2] и так далее до #crops, последнего индекса. Цикл работает для списка любой длины: для сотни культур он выполнится сто раз, а для пустого списка не выполнится ни разу, потому что for i = 1, 0 выполняется ноль раз.
Поскольку Lua считает с 1, цикл идёт от 1 до #crops. Здесь часто делают две ошибки. Если начать с 0, в начале получится лишняя итерация, где элемент равен nil:
local crops = {"морковь", "картофель", "тыква"}
for i = 0, #crops do
print(i, crops[i])
endВыведется:
0 nil
1 морковь
2 картофель
3 тыкваЕсли дойти до #crops + 1, в конце получится лишняя итерация. Из-за .. программа выведет все культуры и остановится с ошибкой:
local crops = {"морковь", "картофель", "тыква"}
for i = 1, #crops + 1 do
print("Культура: " .. crops[i])
endКультура: морковь
Культура: картофель
Культура: тыква
main.lua:3: attempt to concatenate a nil value (field '?')Когда индекс лежит в переменной, цикл умеет больше, чем выводить элементы по порядку. Он может идти назад, с шагом -1, от последнего индекса к первому:
local crops = {"морковь", "картофель", "тыква"}
for i = #crops, 1, -1 do
print(crops[i])
endВыведется:
тыква
картофель
морковьОн может работать сразу с двумя списками. Если связанные значения лежат под одним и тем же индексом в обоих списках, один i читает оба. Здесь days[i] — за сколько дней вырастает crops[i]:
local crops = {"морковь", "картофель", "тыква"}
local days = {3, 4, 7}
for i = 1, #crops do
print(crops[i] .. ", дней до урожая: " .. days[i])
endВыведется:
морковь, дней до урожая: 3
картофель, дней до урожая: 4
тыква, дней до урожая: 7И он может менять элементы, ведь eggs[i] = … работает и с индексом-переменной. Этот цикл удваивает каждое число в списке:
local eggs = {4, 6, 5}
for i = 1, #eggs do
eggs[i] = eggs[i] * 2
end
print(eggs[1], eggs[2], eggs[3])Выведется:
8 12 10Задание
- 1
Напишите цикл
for, переменная которого проходит по индексамseeds, от 1 до#seeds. - 2
В цикле выведите каждые семена с их ценой из
prices:морковь, монет: 2 картофель, монет: 3 тыква, монет: 5 клубника, монет: 4 - 3
Гуго поднял каждую цену на 1 монету. Под циклом напишите второй цикл, который прибавляет 1 к каждому элементу
prices. - 4
Под ним снова выведите семена с ценами, так же, как в первом цикле. Теперь в выводе цены до и после изменения, и он заканчивается так:
морковь, монет: 3 картофель, монет: 4 тыква, монет: 6 клубника, монет: 5