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
如果“target=_blank”,Xamarin Android WebView 不会触发导航