lua弱引用学习笔记

--这个lua弱引用平常很少用到,可能会忘,做个学习记录,应该是只对table有效的

--1、什么也没有处理
local base = {}

local t1 = {name = "test"}
--使用一个table作为key值
base[t1] = 3
t1 = nil

-- 强制进行一次垃圾收集
collectgarbage()

for key, value in pairs(base) do
    print(tostring(key.name) ..":" .. tostring(value))
end

--因为base还保留着对t1的引用 输出 test:3

--2、设置key弱引用
local base = {}

--给table添加__mode元方法,如果这个元方法的值包含了字符串“k”,就代表这个table的key都是弱引用的。
--一旦其他地方对于key值的引用取消了(设置为nil),那么,这个table里的这个字段也会被删除。
setmetatable(base,{__mode = "k"})

local t1 = {name = "test"}
base[t1] = 3

--如果出现 local t2 = t1 也要吧t2 = nil 才会被删除
t1 = nil

-- 强制进行一次垃圾收集
collectgarbage()

for key, value in pairs(base) do
    print(tostring(key.name) ..":" .. tostring(value))
end

--因为设置了key的弱引用 此时没有输出

--3、设置value弱引用
local base = {}

--给table添加__mode元方法,如果这个元方法的值包含了字符串“v”,就代表这个table的value都是弱引用的。
--一旦其他地方对于key值的引用取消了(设置为nil),那么,这个table里的这个字段也会被删除。
setmetatable(base,{__mode = "v"})

local t1 = {name = "test"}
base[3] = t1

--如果出现 local t2 = t1 也要吧t2 = nil 才会被删除
t1 = nil

-- 强制进行一次垃圾收集
collectgarbage()

for key, value in pairs(base) do
    print(tostring(key) ..":" .. tostring(value.name))
end

--因为设置了value的弱引用 此时没有输出

--4、设置key,value弱引用,setmetatable(base,{__mode = "kv"})其实就是上面两种的结合体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值