日落20190703001 - Lua之table拷贝

本文通过实例详细解析Lua中深拷贝与浅拷贝的区别,包括语法糖的使用及多维表拷贝的实现,适合Lua初学者及进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

通过实例了解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节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值