样例
a = {}
b = {}
setmetatable(a, b)
b.__mode = "k" -- now `a' has weak keys
key = {} -- creates first key
a[key] = 1
key = {} -- creates second key
a[key] = 2
collectgarbage() -- forces a garbage collection cycle
for k, v in pairs(a) do print(v) end
--> 2
关键点
- 弱表的引用是弱引用,弱引用不会导致对象的引用计数变化。
- 弱表的metatable定义__mode字段,可以取三个值:k、v、kv。只要key和value中的一个被gc,那么这个key-value pair就被从表中移除。
应用
-
记忆函数:一个相当普遍的编程技术是用空间来换取时间。你可以通过记忆函数结果来进行优化,当你用同样的参数再次调用函数时,它可以自动返回记忆的结果。将函数的输入和输出分别作为key和value放在一个weak table里面。
-
有默认值的表
metas = {}
setmetatable(metas, {__mode = "v"})
setdefault = function (t, d)
local mt = metas[d]
if mt == nil then
mt = {__index = function() return d end}
metas[d] = mt
end
setmetatable(t, mt)
end