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特有的。我认为垃圾收集需要在系统耗尽页面文件空间(例如,系统磁盘已满)时运行,并且必须在进程耗尽堆空间时运行。任何更早的决定都是为了提高流程或系统性能(良好的公民意识),并且是一个实施决策,可以因版本而异,适应不同的环境,等等。