【发布时间】:2017-11-29 22:47:13
【问题描述】:
我有一个包含大量递归子表的大表:
table1={p1={def={...}},
p2={...},
p3={...},
...
p(n)={...}
}
我需要得到这个表的副本,它只包含某些子表
plist={"p1", "p3", "p10",...}
结果,我应该得到一个表格:
table2={p1={def={...}},
p3={...},
p10={...},
...
}
table1 应该保持不变。
我尝试使用此代码:
function deepcopy(o, seen)
seen = seen or {}
if o == nil then return nil end
if seen[o] then return seen[o] end
local no
if type(o) == 'table' then
no = {}
seen[o] = no
for k, v in next, o, nil do
no[deepcopy(k, seen)] = deepcopy(v, seen)
end
setmetatable(no, deepcopy(getmetatable(o), seen))
else
no = o
end
return o
end
local table2 = deepcopy(plist, table1)
还有这个:
local function copy(obj, seen)
if type(obj) ~= 'table' then return obj end
if seen and seen[obj] then return seen[obj] end
local s = seen or {}
local res = setmetatable({}, getmetatable(obj))
s[obj] = res
for k, v in pairs(obj) do res[copy(k, s)] = copy(v, s) end
return res
end
local table2 = copy(plist, table1)
两者都给我不正确的table2。我应该使用什么代码?
【问题讨论】:
-
local table2 = {}; for _,k in ipairs(plist) do table2[k] = table1[k] end