これが私が実際にしたことです:
for j,x in ipairs(a) do copy[j] = x end
Doubが言及しているように、テーブル キーが厳密に単調に増加していない場合は、そうでは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
テーブルとメタテーブルを再帰的に呼び出すことで処理します (これは独自の報酬です)。巧妙なビットの 1 つは、任意の値 (テーブルであるかどうかにかかわらず) を渡すことができ、正しくコピーされることです。ただし、代償として、スタックがオーバーフローする可能性があります。そのため、さらに堅牢な (非再帰的)関数が必要になる場合があります。
しかし、配列を別の変数にコピーしたいという非常に単純なケースでは、それはやり過ぎです。