В целом понятие объединения произвольных таблиц в Lua не имеет смысла, поскольку один ключ может иметь только одно значение.
Существуют особые случаи, в которых конкатенация имеет смысл. Один из них предназначен для таблиц, содержащих простые массивы, что может быть естественным результатом функции, предназначенной для возврата списка результатов.
В этом случае вы можете написать:
-- return a new array containing the concatenation of all of its
-- parameters. Scaler parameters are included in place, and array
-- parameters have their values shallow-copied to the final array.
-- Note that userdata and function values are treated as scalar.
function array_concat(...)
local t = {}
for n = 1,select("#",...) do
local arg = select(n,...)
if type(arg)=="table" then
for _,v in ipairs(arg) do
t[#t+1] = v
end
else
t[#t+1] = arg
end
end
return t
end
Это мелкая копия, и она не пытается выяснить, является ли userdata
или значение функции контейнером или объектом какого-либо вида, который может нуждаться в другой обработке.
Альтернативная реализация может изменить первый аргумент, а не создавать новую таблицу. Это позволило бы сэкономить на копировании и сделать array_concat
отличным от оператора ..
для строк.
Редактировать: Как заметил в комментарии Джозеф Кингри , мне не удалось должным образом извлечь фактическое значение каждого аргумента из ...
. Я также не смог вернуть объединенную таблицу из функции вообще. Это то, что я получаю за кодирование в поле ответа, а не за тестирование кода вообще.