Lua中是否有类似于Python中可用的collections.defaultdict
的功能,它会自动处理不存在的关联数组键的默认值?
我希望下面的代码将nil
设置为v
而不是错误。因此,基本上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]
{}
答案 0 :(得分:5)
是否有Lua标准功能吗?不,但你可以用metatables轻松完成。您甚至可以编写一个函数来创建这样的表:
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
请注意,每个元素都将获得相同的默认值。因此,如果将默认值设为表,则返回表中的每个“empty”元素将有效地引用同一个表。如果那不是你想要的,你将不得不修改这个功能。
答案 1 :(得分:1)
只是认为我会分享我的代码版本,如果有人发现这需要一个与表,对象等兼容的版本。此外,与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 = defaultidct(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"