弱键和弱值
使用 __mode='k'、'v' 或 'kv' 创建适用于缓存结构的弱表。
弱键和弱值 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
什么是弱表?
弱表保存的引用不会阻止垃圾回收。即使弱表仍然存在,其中的对象也可能被回收。
__mode 元方法
在元表上设置 __mode 来控制弱引用:"k" 表示弱键,"v" 表示弱值,"kv" 表示两者都是弱引用。
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})弱值示例
当不存在其他引用时,其中的值可以被回收的缓存。
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
end垃圾回收后,弱值会消失
当对象的唯一引用位于弱值表中时,垃圾回收器会回收该对象,对应的条目也会消失。
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)弱键示例
弱键可以让您将元数据关联到对象,同时不会阻止对象被回收。当键对象被回收时,对应条目也会被删除。
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
end对象注解模式
使用弱键表为对象添加额外数据。当对象被垃圾回收时,其注解也会自动删除。
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)弱键和值表
"kv" 表同时具有弱键和值。只有仍然存活(在其他地方有引用)的键才能保留其条目。
短命表
在 Lua 5.2 及更高版本中,弱键表是短命表:如果值的唯一引用来自键,那么两者会一起被回收。这可以避免意外地保留对象。
使用弱值的缓存模式
最典型的用途是记忆化缓存:内存不足时可以释放缓存结果,而无需手动清除。
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
end限制
弱表不能将基本类型(数字、布尔值和字符串)作为弱值——这些值无法被垃圾回收器回收(字符串会被驻留)。
何时使用弱表
- 应在内存压力下释放内存的对象缓存。
- 将元数据关联到外部对象。
- 为自定义对象实现驻留表。
弱表问题
在元表上设置 __mode = "v" 有什么作用?
回顾:弱键和值
弱表使用 __mode = "k"、"v" 或 "kv",允许垃圾回收器回收其中的键或值。这对于内存安全的缓存和对象注解模式至关重要。
常见问题解答
「弱键和弱值」课时是免费的吗?
是的 — 「弱键和弱值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「弱键和弱值」这节课中我会学到什么?
使用 __mode='k'、'v' 或 'kv' 创建适用于缓存结构的弱表。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「弱键和弱值」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。