weak table 是一个这样的 table,它其中的元素都被弱引用。 弱引用将被垃圾收集器忽略掉, 换句话说, 如果对一个对象的引用只有弱引用, 垃圾收集器将回收这个对象。
weak table 的键和值都可以是 weak 的。
如果一个 table 只有键是 weak 的,那么将运行收集器回收它们的键,
但是会阻止回收器回收对应的值。
而一个 table 的键和值都是 weak 时,就即允许收集器回收键又允许收回值。
任何情况下,如果键和值中任一个被回收了,整个键值对就会从 table 中拿掉。
table 的 weak 特性可以通过在它的 metatable 中设置 __mode
域来改变。
如果 __mode
域中是一个包含有字符 'k
' 的字符串时,
table 的键就是 weak 的。
如果 __mode
域中是一个包含有字符 'v
' 的字符串时,
table 的值就是 weak 的。
在你把一个 table 当作一个 metatable 使用之后,
就不能再修改 __mode
域的值。
否则,受这个 metatable 控制的 table 的 weak 行为就成了未定义的。