Lua 弱引用

我知道 Lua 中的弱引用表功能,但我想使用单个变量的弱引用。

我看过这个提议,建议的 API 如下:

-- creation
ref = weakref(obj)
-- dereference
obj = ref()

看起来理想。但是,在其他文档中似乎没有发现它,只有弱引用表。

是否有类似于 Python 中 对象的弱引用 功能的东西?

点赞
用户2895784
用户2895784

当 Lua 无法提供某些内容时,通常可以通过其他基元来实现它,如下所示:

function weakref(data)
    local weak = setmetatable({content=data}, {__mode="v"})
    return function() return weak.content end
end

我们创建了一个仅包含数据的弱表。然后我们返回一个函数,当调用它时,返回该表的内容。

(请注意,弱引用可能不会在垃圾收集之前被断开,而文本永远不会被垃圾收集。)

2015-03-17 22:15:27
用户258523
用户258523

我相信像这样的代码可以做到你想要的:

local obj = {value = "obj.value"}

local ref = setmetatable({real = obj}, {__mode = "v", __call = function(self) return self.real end})

print(obj.value)
print(ref.real.value)
print(ref().value)

obj = nil
collectgarbage()
collectgarbage()

print(obj)
print(ref.real)
print(ref())

__call 部分是可选的,但它可以让你使用 ref() 调用语法。如果没有它,你必须使用直接访问版本。

2015-03-17 22:16:04