Вывод списка
Что будет, если вывести список целиком?
local crops = {"морковь", "картофель", "тыква"}
print(crops)Выведется примерно такое:
table: 0x109008Вместо элементов Lua выводит тип, table, и число в шестнадцатеричной записи (с цифрами от 0 до 9 и буквами от a до f). Это адрес таблицы — место в памяти компьютера, где она лежит. Он годится лишь для того, чтобы отличать две таблицы друг от друга, и при каждом запуске программы может быть другим. Склеить список со строкой тоже не получится: "Культуры: " .. crops заканчивается ошибкой attempt to concatenate a table value (local 'crops').
Чтобы вывести элементы, соедините их в одну строку с помощью table.concat. Первый аргумент — список, а второй — строка, которая встанет между элементами, разделитель:
local crops = {"морковь", "картофель", "тыква"}
print(table.concat(crops, ", "))
print("Культуры: " .. table.concat(crops, ", "))
print(table.concat(crops, " | "))
print(table.concat(crops))Выведется:
морковь, картофель, тыква
Культуры: морковь, картофель, тыква
морковь | картофель | тыква
морковькартофельтыкваРазделитель стоит только между элементами, а не после последнего. Без разделителя элементы склеиваются. Результат — обычная строка, её можно склеивать с другими строками или хранить в переменной. Для пустого списка table.concat даёт пустую строку.
Элементами могут быть строки и числа, и больше ничего. Для любого другого значения, например true, в сообщении об ошибке указан неподходящий элемент:
print(table.concat({"морковь", true, "тыква"}, ", "))main.lua:1: invalid value (boolean) at index 2 in table for 'concat'Иногда нужно больше, чем сами элементы, например число дней рядом с каждой культурой. Тогда постройте в цикле новый список строк и соедините его в конце:
local crops = {"морковь", "картофель", "тыква"}
local days = {3, 4, 7}
local labels = {}
for i, crop in ipairs(crops) do
labels[#labels + 1] = crop .. " (дней: " .. days[i] .. ")"
end
print(table.concat(labels, ", "))Выведется:
морковь (дней: 3), картофель (дней: 4), тыква (дней: 7)Элементы можно выводить и через io.write в цикле, как в уроке о циклах. Тогда о разделителе придётся заботиться самому: он идёт перед каждым элементом, кроме первого.
local crops = {"морковь", "картофель", "тыква"}
for i, crop in ipairs(crops) do
if i > 1 then
io.write(", ")
end
io.write(crop)
end
print()Выведется:
морковь, картофель, тыкваprint() в конце завершает строку. table.concat делает всё это одной строкой кода.
Задание
- 1
Запустите программу: она выводит адрес таблицы, а не товары. Измените последнюю строку так, чтобы она выводила товары с помощью
table.concat:В продаже: морковь, картофель, тыквы, яйца. - 2
Ниже создайте пустой локальный список
labels. Затем пройдите поgoodsв цикле и для каждого элемента добавляйте в конецlabelsстроку видаморковь (12): название товара, пробел и количество изamountsв скобках. - 3
После цикла выведите
labelsс помощьюtable.concat:Сегодня: морковь (12), картофель (8), тыквы (3), яйца (30).