Lua中是否有类似Python的defaultdict功能?

Lua 中是否有类似于 Python 中的 collections.defaultdict 的功能,可以自动处理不存在的关联数组键的默认值?

我希望下面的代码将 v 设置为 nil 而不是出现错误。所以基本上是默认情况下将 a [2](不存在键)设为 table

a = {}
v = a[2][3]

>>> PANIC: unprotected error in call to Lua API (main.lua:603: attempt to index field '?' (a nil value))

在 Python 中,可以像这样做:

>>> import collections
>>> a = collections.defaultdict(dict)
>>> print a[2]
{}

原文链接 https://stackoverflow.com/questions/10371155

点赞
stackoverflow用户734069
stackoverflow用户734069

有没有 Lua 标准函数可以做到这一点?没有。但你可以用元表来很容易地实现它。你甚至可以编写一个函数来创建这样的表:

function CreateTableWithDefaultElement(default)
  local tbl = {}
  local mtbl = {}
  mtbl.__index = function(tbl, key)
    local val = rawget(tbl, key)
    return val or default
  end
  setmetatable(tbl, mtbl)
  return tbl
end

注意,每个元素将会得到相同的默认值。因此,如果你将默认值设置为一个表,返回的表中的每个“空”元素将有效地引用相同的表。如果这不是你想要的,你将需要修改函数。

2012-04-29 10:02:46
stackoverflow用户867814
stackoverflow用户867814

我觉得我可以分享一下这个代码的版本,如果有人需要兼容表格、对象等的版本。与Nicol的解决方案相反,这个实际上创建了表中请求的条目。

function defaultdict(default_value_factory)
    local t = {}
    local metatable = {}
    metatable.__index = function(t, key)
        if not rawget(t, key) then
            rawset(t, key, default_value_factory(key))
        end
        return rawget(t, key)
    end
    return setmetatable(t, metatable)
end

使用示例:

d = defaultdict(function() return {} end)
table.insert(d["people"], {"Bob", "The Builder"})

names = defaultdict(function(key) return key end)
print(names["bob"]) -- bob
names["bob"] = "bob the builder"
names["ashley"] = "ashley the fire princess"
2014-09-05 22:26:38