Lua 弱引用

Lua weak reference

我知道 Lua 中的弱表功能,但是我想要一个带有单个变量的弱引用。

我看到 this proposal 表明 API 如下:

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

这看起来很理想。但是,这似乎不在其他地方的文档中;只有弱表。

是否有类似于 Python 的 weak reference to object 功能的东西?

当 lua 没有提供某些东西时,通常有一种简单的方法可以从其他原语中实现它。

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

我们创建了一个仅包含其中数据的弱 table。然后我们 return 一个函数,当被调用时,return 是那个 table 的内容。

(注意,弱引用在垃圾回收之前可能不会被破坏,而文字永远不会被垃圾回收。)

我相信这样的事情可以做你想做的事情:

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() 调用语法。没有它你必须使用直接访问版本。