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