在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
经常看到lua表中有 weak table的用法, 例如:
官网上的解释: http://www.lua.org/pil/17.html
大体意思是, 如果一个对象(table1)被另一个对象(table2)引用(reference), 如果table2的表的引用table1方式为弱引用(weak reference), 则 table2是 weak table, table1在被垃圾收集时候不会考虑table2的引用。
表可的 key 可以是一个表, 表的value也可以是一个表。 表中元素的 值为 表不稀奇, 但是key可以为表比较新颖, 如下(这种用法,可以做表的扩展描述, 不用修改原表的基础上)
设置弱表方法:
通过设置元表(metatable)的_mode属性, 属性值为 k - key为弱引用, v - 值为弱引用, kv - key 和 值 都为弱引用。 例如 a = {} b = {} setmetatable(a, b) b.__mode = "k" -- now `a' has weak keys
当垃圾回收器,将弱引用的对象回收后, 对被引用表的影响,如下。 (表中此元素将消失)
如何理解弱表的行为?为什么弱表, 会有这种现象, 当 弱引用对象被回收掉, 主表中弱引用的元素也会消失? 为什么这么定义?
首先, 看看其中有两个概念: 1、 引用(reference), 对对象类型的变量, 其实现上都是引用方式。 基本类型中 number string, 非引用类型。 http://www.cnblogs.com/sifenkesi/p/3850760.html
引用代码示例:
非引用代码示例:
2、 弱引用(weak reference) https://en.wikipedia.org/wiki/Weak_reference#Lua
wiki上解释与lua中弱表引用概念一样, 如果是弱引用, 则此引用关系, 不能阻止 对象对 垃圾回收。 一旦对象 被回收后, 此弱引用, 对应的表中的元素, 也将随之消失。
Linux 软硬连接 类比Lua strong 和 weak 引用 与 linux 软连接概念类似, 硬连接可以增加文件的引用数目, 并且共享同一个inode, 但是软连接, 新建一个不同的inode, 仅仅是链接到目标文件的inode。
如果一个文件有两个硬链接, 无论删除任何其中一个连接, 则文件不会被删除, 如果最后一个硬链接也被删除, 则文件会被删除。 如果一个文件有一个硬链接 和 一个软链接, 删除硬链接, 则文件 会被删除, 同时软链接同步被删除。
关于软硬连接概念和实例, 请参考: http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html
参考代码:
下面类比关系
LUA EXAMPLE CODEVALUE作为 weak 引用 --- weak table a = {} b = {} setmetatable(a, b) b.__mode = "v" -- now `a' has weak value key = {} -- creates second key a["aa"] = key key = nil collectgarbage() -- forces a garbage collection cycle for k, v in pairs(a) do print(v) end --> 0 entry key作为 weak 引用 a = {} b = {} setmetatable(a, b) b.__mode = "k" -- now `a' has weak value key = {} -- creates second key a[key] = 2 key = nil collectgarbage() -- forces a garbage collection cycle for k, v in pairs(a) do print(v) end
|
请发表评论