这次要介绍的内容比较少,就一个——弱引用table
1.无法超越人类智慧的智能——自动内存管理的缺陷
我们都知道,Lua是具备自动内存管理的,好吧,也许有些朋友不知道。
我们只管创建对象,无须删除对象(当然,对于不要的对象你需要设置一下nil值),Lua会自动删除那些被认为是垃圾的对象。
问题就出现在,什么对象才是垃圾对象,有些时候,我们很清楚某个对象是垃圾,但是,Lua却无法发现。
比如这样一个例子:
复制代码 代码如下:
t = {};
-- 使用一个table作为t的key值
key1 = {name = "key1"};
t[key1] = 1;
key1 = nil;
-- 又使用一个table作为t的key值
key2 = {name = "key2"};
t[key2] = 1;
key2 = nil;
-- 强制进行一次垃圾收集
collectgarbage();
for key, value in pairs(t) do
print(key.name .. ":" .. value);
end
这段代码有点复杂,智商低于250的可能会看不懂。
首先以一个table,叫做t。
然后创建一个新的table——key1,这个key1作为t的key值,给t新增了一个字段,赋值为1。
同样的,key2也作为t的一个key值。
接着,调用了collectgarbage函数,可以不管它,我们只要知道,它会让lua进行一次垃圾回收。
最后输出t的所有字段,输出结果如下:
复制代码 代码如下:
[LUA-print] key1:1
[LUA-print] key2:1
这很符合常理,也在我们的预计当中,虽然我们在给t赋值之后,key1和key2都赋值为nil了。
但是,已经添加到table中的key值是不会因此而被当做垃圾的。
换句话说,key1本身已经是nil值,但它曾经所指向的内容依然存放在t中。key2也是一样的情况。
所以我们最后还是能输出key1和key2的name字段。
2.颠覆你的认知——弱引用table
刚刚举例的只是正常情况,那么,如果我们把某个table作为另一个table的key值后,希望当table设为nil值时,另一个table的那一条字段也被删除。
应该如何实现?
这时候就要用到弱引用table了,弱引用table的实现也是利用了元表。
我们来看看下面的代码,和之前几乎一样,只是加了一句代码:
复制代码 代码如下:
t = {};
-- 给t设置一个元表,增加__mode元方法,赋值为“k”
setmetatable(t, {__mode = "k"});
-- 使用一个table作为t的key值
key1 = {name = "key1"};
t[key1] = 1;
key1 = nil;
-- 又使用一个table作为t的key值
key2 = {name = "key2"};
t[key2] = 1;
key2 = nil;
-- 强制进行一次垃圾收集
collectgarbage();
for key, value in pairs(t) do
print(key.name .. ":" .. value);
end
留意,在t被创建后,立刻给它设置了元表,元表里有一个__mode字段,赋值为”k”字符串。
如果这个时候大家运行代码,会发现什么都没有输出,因为,t的所有字段都不存在了。
这就是弱引用table的其中一种,给table添加__mode元方法,如果这个元方法的值包含了字符串”k”,就代表这个table的key都是弱引用的。
一旦其他地方对于key值的引用取消了(设置为nil),那么,这个table里的这个字段也会被删除。
通俗地说,因为t的key被设置为弱引用,所以,执行t[key1] = 1后,t中确实存在这个字段。
随后,又执行了key1 = nil,此时,除了t本身以外,就没有任何地方对key1保持引用,所以t的key1字段也会被删除。
3.三种形式的弱引用
对于弱引用table,其实有三种形式:
1)key值弱引用,也就是刚刚说到的情况,只要其他地方没有对key值引用,那么,table自身的这个字段也会被删除。设置方法:setmetatable(t, {__mode = “k”});
2)value值弱引用,情况类似,只要其他地方没有对value值引用,那么,table的这个value所在的字段也会被删除。设置方法:setmetatable(t, {__mode = “v”});
3)key和value弱引用,规则一样,但是key和value都同时生效,任意一个起作用时都会导致table的字段被删除。设置方法:setmetatable(t, {__mode = “kv”});
当然,这里所说的被删除,是指在Lua执行垃圾回收的时候,并不一定是立刻生效的。
我们刚刚只是为了测试,而强制执行了垃圾回收。
4.结束
好了,这次的内容比较少,其实书上有蛮多关于弱引用的例子的。
关于Lua的最基础部分,到这里算是结束了。
后面的内容是一些库的介绍,以及更深入的一些内容(C和Lua间调用、自定义类型、线程、内存管理)。
接下来可能会放缓文章更新速度,因为好多库的介绍,不知道有没有必要用文章记录下来。
可能而已~
Lua,弱引用table
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- dnf2022夏日套有必要买吗
- 《超级马里奥大电影》新作将于2026年4月全球上映!
- 《PUI PUI 天竺鼠车车 THE MOVIE MOLMAX》电影定名
- 任天堂已经关闭的游戏服务器中竟然还有玩家在线?
- 女子十二乐坊首张日本大碟《BeautifulEnergy/美丽能源》原版[WAV+CUE]
- 群星1990-中国老歌精粹VOL.1[T123-02银圈版][WAV+CUE]
- Burmester《ArtForTheEarCD-柏林之声3》【WAV+CUE】
- 陶德遗憾没为《老滚5》等推出更多内容 承诺做出改变
- 快来使用吧!WeGame分享《黑神话:悟空》手机壁纸
- 因《鬼屋魔影RE》未达预期 Embracer关闭工作室
- 郑智化 专业音响示范碟《追梦·往日之声精选集 DSD》[WAV+CUE][400MB]
- 妙音唱片《绝对发烧25HQ 头版限量编号 低速原抓》[WAV+CUE][670MB]
- 《张玮伽2024 海浪 HQCDII限量版 天艺》[WAV+CUE][640MB]
- 幽夜默示录其一怎么过?秘境通过攻略分享
- 【原神】枫丹世界任务 | 我们的目标在另一条管道