`table.insert`如何在Lua中使用自定义表

时间:2013-06-28 16:34:02

标签: lua lua-table

我想知道table.insert在lua中是如何工作的?!

我问这个是因为我试图在__newindex metamethod的自定义表上使用它 但它似乎没有称之为。有没有办法让我的自定义表功能与table.insert一起使用?!

根据我对语言的谦虚知识,我会说它使用类似rawset的东西,或者我可能不喜欢的东西。

我工作的样本:

do
    tabl = {1,2,3}
    local _tabl = tabl
    tabl = {}
    local mt = { __newindex = function(t,k,v) print"changing" ;_tabl[k] = v end, __index = _tabl}
    setmetatable(tabl,mt)
end

tabl[4] = 4;    --prints "changing"
table.insert(tabl,5) -- prints nothing!!

2 个答案:

答案 0 :(得分:5)

没有这样的元方法,table.insert只是将新值插入到指定的表中。

local myTable = {}
table.insert(myTable, "somestring")
-- so now myTable has one value, myTable = { "somestring" }

它的工作原理如下:

local myTable = {}
myTable[#myTable + 1] = "somestring"

__ newindex metamethod只影响赋值运算符" =",table.insert只是一个与metatable不相关的独立函数,如果需要,可以修改此函数的行为:

_tableinsert = table.insert
function table.insert(t, v)
    -- here your actions, before real function will be used
    _tableinsert(t, v)
end

我认为可以通过这种方式制作自己的元方法__tableinsert。

答案 1 :(得分:3)

table.insert实际上使用的是rawset。请参阅lua 5.1来源here

如上所述,如果你自己完成作业,你应该能够得到你想要的行为。