lua深度拷贝问题
程序员文章站
2022-03-18 18:13:44
...
lua深度拷贝问题
-
问题描述:
针对tabel类型保存,如果需要将当前赋值保存到另一个tabel里,而且该数据不能随被copy对象的变化而变化,就需要进行深度拷贝处理。 -
实例测试及验证:
local 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 --pairs(orig)==next, orig, nil
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))--此行经测试可写可不写
else
copy = orig
end
return copy
end
local function test()
local ss=2
local a=ss
print(a) --2
ss=3
print(a) --2
local yy={
item=5,
key=9,
data={"oo","pp"}
}
local d1=yy
local d2=deepcopy(yy)
for k,v in pairs(d1) do
if type(v)=='table' then
print(#v) --2
else
print(v) --5,9
end
end
for k,v in pairs(d2) do
if type(v)=='table' then
print(#v) --2
else
print(v)--5,9
end
end
yy.item=0
yy.key=1
table.insert(yy.data,"tt")
for k,v in pairs(d1) do
if type(v)=='table' then
print(#v) --3
else
print(v) --0,1
end
end
for k,v in pairs(d2) do
if type(v)=='table' then
print(#v) --2
else
print(v)--5,9
end
end
end
- 测试总结:
上述“- -”后面是备注描述及测试打印结果。其中a的打印结果均是2,说明值类型复制a,不会跟着被复制对象ss变化而变化。而tabel类型d1、d2,在被复制对象yy发生变化后,打印出了不同的结果,其中直接赋值的d1打印出yy被新赋值的结果,而经深度拷贝的d2还是原来的结果,所以想要新保存的tabel类型不随被复制对象变化而变化,就需要进行深度拷贝。 - 总结:
深度拷贝常用于需要保存上一次复制结果。