Вот что я на самом деле:
for j,x in ipairs(a) do copy[j] = x end
Doub mentions Как, если ключи таблицы не строго монотонно возрастает, она должна быть pairs
не ipairs
.
Я также нашел deepcopy
функцию, которая является более надежной:
function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
Он обрабатывает таблицы и метатаблицы путем вызова себя рекурсивно (which is its own reward). Один из умных битов состоит в том, что вы можете передать ему любое значение (независимо от таблицы или нет), и оно будет скопировано правильно. Однако стоимость заключается в том, что он может потенциально переполнить стек. Поэтому может потребоваться еще более надежный (нерекурсивный) function.
Но это слишком много для простого случая, когда вы хотите скопировать массив в другую переменную.
Почему существуют два параметра, если он копирует один объект? – claudekennilol
@claudekennilol Второй параметр должен быть проигнорирован «внешним» абонентом и используется только для рекурсивных вызовов. Это позволяет избежать повторного глубокого копирования таблиц, которые встречаются более одного раза в одной таблице. Например. a = {} b = {k1 = a, k2 = a}. Если b2 является копией b, приятно сохранить b2.k1 == b2.k2. Дополнительный параметр 'seen' помогает сделать это возможным. –
Tyler