Вложенные таблицы
Значением в таблице может быть другая таблица, а в ней — ещё таблицы. Так описывают что-то большое, например всю ферму:
local farm = {
name = "Ферма «Подсолнух»",
coins = 120,
barn = {eggs = 18, milk = 6},
fields = {"carrot", "potato", "pumpkin"},
}
print(farm.barn.eggs)
print(farm.fields[2])
print(#farm.fields)Выведется:
18
potato
3Читайте farm.barn.eggs слева направо: farm.barn — это таблица амбара, а .eggs читает из неё ключ eggs. Точки и квадратные скобки можно ставить цепочкой сколько нужно: farm.fields[2] — второй элемент списка в поле fields. Значение меняется так же: farm.barn.eggs = farm.barn.eggs + 6.
Вложенные таблицы могут быть словарями, списками или записями, в любом сочетании. Вот словарь записей, по одной на каждое животное:
local animals = {
bella = {kind = "корова", age = 4},
rex = {kind = "пёс", age = 2},
}
print(animals.bella.kind .. ", возраст: " .. animals.bella.age)
print(animals.rex.kind)корова, возраст: 4
пёсСписки тоже можно вкладывать друг в друга: поле из грядок, ряд за рядом, — это список списков, а plots[2][3] — третья грядка во втором ряду.
Типичная ошибка — чтение через таблицу, которой нет. Допустим, Эмма хранит инструменты в сарае, но на ферме сарая ещё нет:
local farm = {name = "Ферма «Подсолнух»", barn = {eggs = 18}}
print(farm.shed.tools)main.lua:3: attempt to index a nil value (field 'shed')Индексировать таблицу (to index) — значит обращаться к одному из её ключей через точку или квадратные скобки. farm.shed равно nil, а ключ tools из nil прочитать нельзя. В сообщении названо поле, которое оказалось nil, — 'shed': проблема в том, что стоит перед последней точкой, а не в tools. Та же ошибка будет и при присваивании, farm.shed.tools = 4: вложенную таблицу Lua за вас не создаёт. Сначала создайте её:
local farm = {name = "Ферма «Подсолнух»", barn = {eggs = 18}}
farm.shed = {}
farm.shed.tools = 4
print(farm.shed.tools)4Или в один шаг: farm.shed = {tools = 4}. Если вы не уверены, что вложенная таблица есть, проверьте заранее: if farm.shed then … end или одним выражением farm.shed and farm.shed.tools, которое вместо ошибки даёт nil, когда сарая нет.
Задание
- 1
Программа заканчивается ошибкой: молока нет у самой фермы, оно лежит в амбаре. Исправьте
printтак, чтобы он выводил:Молоко: 6 л - 2
На ферме появилась новая курица по имени Голди. Под
printдобавьте её в списокfarm.animalsчерезtable.insertзаписью с именем"Голди"и видом"курица". Затем пройдите по списку черезipairsи выведите каждое животное:корова Белла пёс Рекс курица Голди - 3
Эмма построила сарай для своих 4 инструментов. В конце программы добавьте в
farmключshed, в котором лежит таблица с ключомtoolsи значением4. Затем выведите число, прочитав его черезfarm.shed.tools:Инструменты: 4