2.10.2 - Weak Table(弱表)

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 行为就成了未定义的。