Lua中使用元表__add实现表合并时出现'attempt to call field insert (a nil value)'错误的原因是什么?
为什么Lua中用__add元方法合并表时出现"attempt to call field 'insert' (a nil value)"错误?
哈哈,这个坑我刚学Lua的时候也踩过!问题出在你__add元方法的参数命名上——你用了table作为第一个参数的名字,直接把全局的table标准库给覆盖了!
咱们来拆解一下:在Lua函数里,参数本质上就是函数内的局部变量。当你在__add方法里写function(table, otherTable),这里的table就不再是全局那个提供insert、remove等方法的标准库了,而是指代第一个操作数table1(也就是那个存着{1,2,3,4,5}的数组表)。这个数组表本身根本没有insert字段,所以调用table.insert的时候自然就会报错说它是nil值。
修正后的代码
把参数名改成和全局库不冲突的名字就搞定了,顺便给sumTable加上local(避免污染全局环境,Lua编程的小细节):
table1 = {1,2,3,4,5} table2 = {1,2,3,4} metatable = { __add = function(t1, t2) local sumTable = {} for i = 1, #t1 do table.insert(sumTable, t1[i]) end for i = 1, #t2 do table.insert(sumTable, t2[i]) end return sumTable end } setmetatable(table1, metatable) table1 = table1 + table2 -- 可以加个测试输出看看结果 for _, val in ipairs(table1) do print(val) end
这样运行就不会报错了,合并后的表会包含两个原表的所有元素~
内容的提问来源于stack exchange,提问作者cembed
相关产品推荐
相关产品推荐

