lua之弱表

弱表 指内部元素为 弱引用 的表。 垃圾收集器会将弱引用视为无引用。如果一个对象只被弱引用引用到, 垃圾收集器就会回收这个对象。

弱表什么时候会用到呢,先看下面的例子:

local t={}

--用k来做t的key,将1存入t
local k={}
t[k]=1

--重新生成一个table'k' ,并作为key将2存入t
k={}
t[k]=2

--垃圾回收
collectgarbage()

for k,v in pairs(t) do
    print(k,v)
end

输出:

table: 00000000006e9ba0 1

table: 00000000006e98e0 2

 

可以看到,当我们为k重新创建一个table,并再次作为key存入t中时,t中第一个key-value的键值对依然存在。

这时,一般来讲,我们不会再用到第一个键值对了,但是t保持着对其的引用,导致第一个table无法被回收。

 

弱表在这个时候就派上用场了。我们可以将t指定为弱表。

 

一个table的弱引用类型是通过其元表的__mode字段来决定的。

使用方法很简单,只需要给t的元表加上__mode字段即可。

setmetatable(t,{__mode='k'})
--'k'代表table是key弱引用,'v'代表table是value弱引用,'kv'代表table是key-value弱引用

 

将t设置为弱表后再执行一次

local t={}
setmetatable(t,{__mode='k'})

local k={}
t[k]=1

k={}
t[k]=2


collectgarbage()

for k,v in pairs(t) do
    print(k,v)
end

输出:

table: 00000000001b9920 2

 

第一个table就被正常回收了,并且t中自动帮我们移除了第一个键值对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值