Lua弱参考

时间:2015-03-17 21:06:24

标签: lua lua-table

我知道Lua中的弱表功能,但我希望对单个变量有一个弱引用。

我见过this proposal建议API如下:

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

这看起来很理想。然而,这似乎并未出现在其他地方的文件中;只有弱桌。

是否有类似于Python weak reference to object功能的内容?

2 个答案:

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