lua弱引用学习笔记

↘锁芯ラ 提交于 2020-01-18 19:40:51

--这个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"})其实就是上面两种的结合体

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!