table.insert不会触发__index?

我使用元表制作了一个自动跟踪大小的自定义表,当添加元素时。它运行得非常好,而且不需要使用#操作符或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] =“嗨” t[17] =“你好” t[2] =“yo” t[17] = nil print(t.size()) -打印2

local z = Table_new() table.insert(z,“嘿”) table.insert(z,“你好”) table.insert(z,“yo”) print(z.size()) -印1-为什么?

`` `

点赞
用户107090
用户107090

如果在__newindex中打印k,v,你会发现k总是1。这是因为table.insert请求表的大小以查找插入值的位置。默认情况下,它是在末尾。你应该添加一个__len元方法。但也许这会否定你的目的(这对我来说很晦涩)。

2017-12-29 13:47:54