我知道Lua中的弱表功能,但我希望对单个变量有一个弱引用。
我见过this proposal建议API如下:
-- creation
ref = weakref(obj)
-- dereference
obj = ref()
这看起来很理想。然而,这似乎并未出现在其他地方的文件中;只有弱桌。
是否有类似于Python weak reference to object功能的内容?
答案 0 :(得分:8)
当lua没有提供某些东西时,通常有一种简单的方法可以从其他原语中实现它。
function weakref(data)
local weak = setmetatable({content=data}, {__mode="v"})
return function() return weak.content end
end
我们只用其中的数据创建一个弱表。然后我们返回一个函数,当调用它时,返回该表的内容。
(注意,在垃圾收集之前,弱引用可能不会被破坏,文字永远不会被垃圾收集。)
答案 1 :(得分:4)
这样的事情可以做你想要的事情我相信:
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()
调用语法。没有它,您必须使用直接访问版本。