Таблицы
До сих пор каждая переменная хранила одно значение. Но что если нужно хранить список из 16 слотов инвентаря? Или координаты нескольких точек? Или настройки программы?
В Lua для этого существует одна универсальная структура данных — таблица.
Таблица как список (массив)
Самый простой вид таблицы — упорядоченный список значений:
local fruits = {"яблоко", "банан", "апельсин"}
local primes = {2, 3, 5, 7, 11, 13}
local mixed = {42, "hello", true, nil, 3.14}
Элементы нумеруются с 1 (не с 0, как в большинстве языков):
print(fruits[1]) -- яблоко
print(fruits[2]) -- банан
print(fruits[3]) -- апельсин
Изменить элемент:
fruits[2] = "манго"
print(fruits[2]) -- манго
Добавить в конец:
fruits[4] = "виноград"
-- или
table.insert(fruits, "киви")
Длина таблицы-списка
Оператор # возвращает количество элементов:
local items = {"sword", "pickaxe", "torch", "bread"}
print(#items) -- 4
for i = 1, #items do
print(i .. ": " .. items[i])
end
Таблица как словарь (хэш-таблица)
Таблица может хранить пары "ключ — значение". Ключи не обязательно числа — это могут быть строки:
local player = {
name = "Nikita",
health = 20,
level = 42,
isAdmin = false
}
print(player.name) -- Nikita
print(player.health) -- 20
print(player["level"]) -- 42 (альтернативный синтаксис)
Добавить или изменить поле:
player.score = 1500 -- новое поле
player.health = 18 -- изменить существующее
player.oldField = nil -- удалить поле
Вложенные таблицы
Таблицы могут содержать другие таблицы:
local waypoints = {
{ name = "Дом", x = 0, y = 64, z = 0 },
{ name = "Шахта", x = 100, y = 12, z = -50 },
{ name = "Ферма", x = -30, y = 65, z = 80 },
}
for i = 1, #waypoints do
local wp = waypoints[i]
print(wp.name .. ": " .. wp.x .. ", " .. wp.y .. ", " .. wp.z)
end
Таблица как набор настроек
Распространённый паттерн — хранить конфигурацию в таблице:
local config = {
fuelThreshold = 100,
returnOnFull = true,
mineDepth = 50,
torchInterval = 8,
logFile = "miner.log"
}
if turtle.getFuelLevel() < config.fuelThreshold then
print("Мало топлива, порог: " .. config.fuelThreshold)
end
Полезные функции table.*
local list = {3, 1, 4, 1, 5, 9, 2, 6}
table.insert(list, 7) -- добавить в конец
table.insert(list, 1, 0) -- вставить 0 на позицию 1
table.remove(list, 2) -- удалить элемент на позиции 2
table.sort(list) -- отсортировать по возрастанию
-- Объединить список в строку через разделитель
print(table.concat(list, ", "))
Инвентарь черепашки как таблица
Хороший пример применения — сканирование инвентаря:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
local function getInventory()
local inv = {}
for slot = 1, 16 do
local detail = turtle.getItemDetail(slot)
if detail then
inv[slot] = {
name = detail.name,
count = detail.count
}
end
end
return inv
end
local inv = getInventory()
for slot, item in pairs(inv) do
print("Слот " .. slot .. ": " .. item.name .. " x" .. item.count)
end
🚀 Задания
Задание 1
Создай таблицу shopping с пятью продуктами и их ценами. Выведи каждый в формате "Товар: цена". Добавь новый товар через table.insert и выведи обновлённый список.
Задание 2
Создай таблицу robot с полями: name, fuelLevel, position (вложенная таблица с x, y, z), isActive. Выведи все данные в читаемом виде.
Задание 3
Напиши функцию countItems(inventory), которая принимает таблицу-инвентарь и возвращает общее количество предметов во всех слотах.
Задание 4
Создай таблицу-маршрут: список точек {x, y, z}. Напиши функцию totalDistance(route), которая считает суммарное расстояние между соседними точками (можно использовать math.abs по каждой оси).
Задание 5
Напиши функцию findInInventory(name), которая сканирует инвентарь черепашки и возвращает таблицу со всеми слотами, где есть предмет с указанным именем, и общим количеством этих предметов.