我使用metatables制作了一个自定义表格,可以在添加元素时自动跟踪大小调整。它运行良好,无需#
运算符或getn
函数。
然而它有问题。如果您致电table.insert
,该功能显然从不会调用__index
或__newindex
。因此,我的表无法知道何时以这种方式删除元素。我认为问题与table.remove
一样。
我怎么能:
insert
的事件并使用我自己的功能insert
,则会出错。由于
function Table_new()
local public = { }
local tbl = { }
local size = 0
function public.size()
return size
end
return setmetatable(public, {
__newindex = function(t, k, v)
local previous_v = tbl[k]
rawset(tbl, k, v)
if previous_v ~= nil then
if v == nil then
size = size - 1
end
elseif v ~= nil then
size = size + 1
end
end,
__index = tbl
})
end
local t = Table_new()
t[5] = "hi"
t[17] = "hello"
t[2] = "yo"
t[17] = nil
print(t.size()) -- prints 2
local z = Table_new()
table.insert(z, "hey")
table.insert(z, "hello")
table.insert(z, "yo")
print(z.size()) -- prints 1 -- why?
答案 0 :(得分:1)
如果在__newindex中打印k,v,您将看到k始终为1.这是因为table.insert
要求表的大小以查找插入值的位置。默认情况下,它结束了。你应该添加一个__len元方法。但也许这会破坏你的目的(这对我来说是模糊不清的)。