Создание списков
В уроке о циклах вы научились повторять код. В этом уроке вы научитесь хранить много значений под одним именем.
У Эммы на ферме «Подсолнух» растёт несколько культур. С тем, что вы знаете сейчас, для каждой понадобилась бы своя переменная:
local crop1 = "морковь"
local crop2 = "картофель"
local crop3 = "тыква"Это много печатать, а пройти по ним циклом нельзя: crop1 и crop2 — просто два имени, никак не связанные друг с другом. В Lua есть инструмент получше: таблица. Таблица, в которой значения хранятся по порядку, одно за другим, называется списком. Значения записывают в фигурных скобках через запятую:
local crops = {"морковь", "картофель", "тыква"}Значения списка — его элементы. В этом списке три элемента в строгом порядке: "морковь" — первый, "тыква" — последний. Таблицы — единственный способ Lua собирать значения вместе. В этом уроке в таблицах лежат списки. В следующих уроках такие же таблицы будут хранить словари и даже объекты.
У каждого элемента есть своё место — индекс. В Lua индексы начинаются с 1: у первого элемента индекс 1, у второго — 2 и так далее. Чтобы прочитать элемент, напишите имя списка и индекс в квадратных скобках:
local crops = {"морковь", "картофель", "тыква"}
print(crops[1])
print(crops[3])Выведется:
морковь
тыкваВот как элементы и их индексы соотносятся:
crops: | "морковь" | "картофель" | "тыква" |
index: 1 2 3В большинстве других языков (Python, JavaScript, C…) индексы считают с 0. Lua считает с 1, как люди считают предметы. Если когда-нибудь вы начнёте изучать другой язык, помните об этой разнице.
Что будет, если взять индекс, под которым нет элемента, например 0 или 4? Во многих языках программа остановится с ошибкой. Lua — нет: вы просто получите nil, значение, которое означает «ничего»:
local crops = {"морковь", "картофель", "тыква"}
print(crops[0], crops[4])Выведется:
nil nilnil создаёт проблемы только потом, когда вы пытаетесь его использовать. Например, если приклеить его к строке, программа завершится с ошибкой:
local crops = {"морковь", "картофель", "тыква"}
print("Культура: " .. crops[4])main.lua:2: attempt to concatenate a nil value (field 'integer index')Сообщение говорит, что вы пытались соединить (concatenate) значение nil и что оно взято из таблицы: field — слово Lua для места в таблице, а индексом здесь было целое число. Увидев такую ошибку, проверьте индекс.
Элементами могут быть и числа, а список может быть пустым: {}. Как заполнять пустой список, вы узнаете позже в этом уроке. Элемент, прочитанный из списка, — обычное значение, поэтому с ним можно считать или приклеивать его к строке:
local eggs = {4, 6, 5}
print(eggs[1] + eggs[2])
print("Яиц сегодня: " .. eggs[3])Выведется:
10
Яиц сегодня: 5Задание
- 1
Программа должна вывести первую культуру Эммы, но при запуске она завершается с ошибкой:
main.lua:3: attempt to concatenate a nil value (field 'integer index'). Исправьте индекс, чтобы программа вывелаПервая культура: морковь. - 2
Ниже выведите последнюю, четвёртую культуру тем же способом:
Последняя культура: клубника. - 3
Ещё ниже создайте локальную переменную
eggsсо списком яиц, которые куры Эммы снесли за последние три дня:4,6и5в таком порядке. - 4
Выведите, сколько всего яиц куры снесли за три дня. Сложите в коде три элемента
eggs, не считайте число сами:Всего яиц: 15.