Lua 我不知道';我不能得到一张弱表
好的,我想实现一个缓存生成器,它向我返回一个句柄,但不给我实际的数据Lua 我不知道';我不能得到一张弱表,lua,weak-references,Lua,Weak References,好的,我想实现一个缓存生成器,它向我返回一个句柄,但不给我实际的数据 local module = {} cache = {} setmetatable(cache, { __mode = "k" }) function getItem(item) local result = cache[item] or cacheItem(item) return item end function cacheItem(item) print("Caching item") c
local module = {}
cache = {}
setmetatable(cache, { __mode = "k" })
function getItem(item)
local result = cache[item] or cacheItem(item)
return item
end
function cacheItem(item)
print("Caching item")
cache[item] = true
return cache[item]
end
function printCache()
for key, value in pairs(cache) do
print(key.name .. " and " .. value)
end
end
module.printCache = printCache
module.getItem = getItem
return module
但当我尝试使用它时:
local module = require("./cache")
a = {
name = "Jimmie"
}
function foo()
local b = {
name = "Bobbie"
}
local h1 = module.getCachedItem(a)
module.getCachedItem(b)
local h3 = module.getCachedItem({ name = "Lenny" })
module.printCache()
end
foo()
module.printCache()
第一次,我希望所有的名字都打印出来。
第二次,我只希望“Jimmie”被印刷出来。
然而,所有的名字都打印了两次
lua-v
返回5.2.4.在调用foo()之后插入collectgarbage()。我猜Lua在垃圾收集行为上是相当不确定的。@hgiesel我不认为这是Lua特有的。我认为垃圾收集需要在系统耗尽页面文件空间(例如,系统磁盘已满)时运行,并且必须在进程耗尽堆空间时运行。任何更快的解决方案都是为了提高流程或系统性能(良好的公民意识),这是一个实施决策,可能因版本而异,适应不同的环境,等等。只需在调用foo()
后插入collectgarbage()
,就可以了。我猜Lua在垃圾收集行为上是相当不确定的。@hgiesel我不认为这是Lua特有的。我认为垃圾收集需要在系统耗尽页面文件空间(例如,系统磁盘已满)时运行,并且必须在进程耗尽堆空间时运行。任何更早的决定都是为了提高流程或系统性能(良好的公民意识),并且是一个实施决策,可以因版本而异,适应不同的环境,等等。