5

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

我问这个是因为我尝试在带有元方法的自定义表上使用它,__newindex但似乎没有调用它。有没有办法让我的自定义表格功能与 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!!
4

2 回答 2

5

没有这样的元方法,table.insert 只是向指定的表插入一个新值。

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

它的工作原理如下:

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

__newindex 元方法仅影响赋值运算符“=”,table.insert 只是一个与元表无关的单独函数,您可以根据需要修改此函数的行为:

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

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

于 2013-06-28T16:50:31.803 回答
3

table.insert 实际上使用 rawset。请参阅此处的 lua 5.1 源代码。

如前所述,如果您自己完成作业,您应该能够获得您想要的行为。

于 2013-06-28T17:09:18.857 回答