`table.insert` 在 Lua 中如何与自定义表格一起使用?

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

我问这个问题是因为我试图在具有 __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;    --打印“changing”
table.insert(tabl,5) -- 什么也不打印!!
点赞
用户1857483
用户1857483

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

local myTable = {}
table.insert(myTable, "somestring")
-- 现在myTable有一个值,myTable = { "somestring" }

它的作用类似于:

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

__newindex元方法只影响赋值运算符“=”,table.insert只是一个独立的函数,与元表没有关系。如果您需要,可以修改此函数的行为:

_tableinsert = table.insert
function table.insert(t, v)
    -- 在真正的函数被使用之前,执行你的动作
    _tableinsert(t, v)
end

我认为通过这种方式可以自己创建__tableinsert元方法。

2013-06-28 16:50:31
用户258523
用户258523

table.insert 实际上使用的是 rawset。可以参考 Lua 5.1 源码 这里

如果你自己进行赋值操作,就可以得到你想要的行为。

2013-06-28 17:09:18