目的
通过实例了解lua table的深浅拷贝区别和语法糖
实例
(1)a浅拷贝到b,当b改动时,a也会改动。
a={}
aaa={}
function aaa:a()
a['x']=10
end
function aaa:b( ta )
b=ta
print(b['x'])
b['x']=20
print(a['x'])
a=nil
print(b['x'])
b=nil
end
aaa:a()
aaa:b(a)
(2)a深拷贝到b,当b改动时,a就不会改动。
a={}
aaa={}
function aaa:a()
a['x']=10
end
function aaa:dp( ta )
for k,v in pairs(ta) do
print('ta',k,v)
end
local b={}
for k,v in pairs(ta) do
b[k]=v
end
return b
end
function aaa:b( ta )
b=aaa:dp(ta)
print(b['x'])
b['x']=20
print(a['x'])
a=nil
print(b['x'])
b=nil
end
aaa:a()
aaa:b(a)
(3)但当a不是一维时,就需要对深拷贝方法进行修改,利用递归作解析。
a={}
aaa={}
function aaa:a()
a['x']={}
a['x'][1]=10
end
function aaa:dp( ta )
for k,v in pairs(ta) do
print('ta',k,v)
end
local b={}
for k,v in pairs(ta) do
if type(v)=='table' then
b[k]=aaa:dp(v)
else
b[k]=v
end
end
return b
end
function aaa:b( ta )
b=aaa:dp(ta)
print(b['x'][1])
b['x'][1]=20
print(a['x'][1])
a=nil
print(b['x'][1])
b=nil
end
aaa:a()
aaa:b(a)
(4)由于有syntactic sugar,所以a[‘x’]等于a.x,可以改写一下,更雅观。
a={}
aaa={}
function aaa:a()
a['x']={}
a['x'][1]=10
end
function aaa:dp( ta )
for k,v in pairs(ta) do
print('ta',k,v)
end
local b={}
for k,v in pairs(ta) do
if type(v)=='table' then
b[k]=aaa:dp(v)
else
b[k]=v
end
end
return b
end
function aaa:b( ta )
b=aaa:dp(ta)
print(b.x[1])
b.x[1]=20
print(a.x[1])
a=nil
print(b.x[1])
b=nil
end
aaa:a()
aaa:b(a)
以上简单回顾。
参考资料:
《Lua程序设计(第二版)》第2.5节