table.insert不会触发__index?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了table.insert不会触发__index?相关的知识,希望对你有一定的参考价值。

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

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

以上是关于table.insert不会触发__index?的主要内容,如果未能解决你的问题,请参考以下文章

在 JQuery 对话框文本框中输入单击不会触发 __doPostBack

webpack.DefinePlugin

如果“target=_blank”,Xamarin Android WebView 不会触发导航

JQuery_004_触发事件

QML - .qml 文件中的“连接”不会触发来自 python 脚本的信号

Lua易忘点