table.insert不会触发__index?

时间:2017-12-29 12:28:27

标签: lua metatable

我使用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?

1 个答案:

答案 0 :(得分:1)

如果在__newindex中打印k,v,您将看到k始终为1.这是因为table.insert要求表的大小以查找插入值的位置。默认情况下,它结束了。你应该添加一个__len元方法。但也许这会破坏你的目的(这对我来说是模糊不清的)。