【问题标题】:What are weak references?什么是弱引用?
【发布时间】:2020-07-27 06:49:48
【问题描述】:

我试图理解弱表/弱引用,但仍然无法理解任何东西。

"弱引用是对垃圾收集器不考虑的对象的引用"

我在Programming in Lua First Edition 找到了这个,但它说的下一句话让我很困惑

"这意味着,如果一个对象只保存在弱表中,Lua 最终会收集该对象。"

还有这些信息(虽然不是来自书本)

“如果一个对象有 0 个引用,则将其视为“垃圾””

local t = {x = val} -- x is a weak reference because val isn't considered as "garbage" even after getting removed, x is still a reference of val

val = nil

collectgarbage() --you'd expect {} to be collected

for i, v in pairs(t) do
    print(v) --prints the table
end

该对象仅保存在一个弱表(即 t)中,但 Lua 不收集它。我仍然可以打印表格,表格没有被垃圾收集器清除。

这个信息也得到了Lua 5.1 Reference Manual的证明

“换句话说,如果一个对象的唯一引用是弱引用,那么垃圾收集器就会收集这个对象。”

我收集的信息或显示的代码有什么问题吗?我学习东西很差,所以我不得不问很多问题。 如果是,请给我正确的信息和一些具体的例子。

编辑:我现在了解弱表和弱引用是如何工作的,我还学到了关于 table.insert() 的新东西:我可以用 table.insert() 插入表,看起来很棒.

【问题讨论】:

  • 在您的代码示例中,t 未显示为弱表,您未将 metatable 设置为 t,也不要将 __mode 字段放入 metatable。
  • 哦,好吧,所以我必须把它变成一个弱表。

标签: lua weak-references


【解决方案1】:

首先,您必须将表声明为弱(即,具有弱键或弱值或两者兼有)

local weak = setmetatable({}, {__mode="v"}) -- Create table weak with weak values

然后你可以在表中存储一个对象

table.insert(weak, {"hello", "world"})

由于除了作为表中的值之外没有其他对该对象的引用,因此它将在下次运行时被 GC 收集。整个 key-value-pair 将从 table 中消失,它将是空的,因为没有其他 paris。

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2013-07-06
    • 1970-01-01
    • 2012-06-29
    • 2011-09-01
    • 2014-06-17
    • 2010-12-01
    • 2011-10-15
    • 2013-12-24
    相关资源
    最近更新 更多