Lua中table.insert()覆盖表所有索引问题求助
问题根源
你的问题根本不是table.insert()的问题,而是Token类的构造函数实现错误,导致所有创建的Token实例都是同一个对象。每次调用TOK:new()时,你修改的是Token元表本身,而非创建新的独立实例,所以最后插入到Tokens表中的所有元素都指向同一个Token,看起来就像是被覆盖了。
修复Token构造函数
把Token的new方法改成正确的Lua面向对象实现:
local C = require("constants") local Token = {} Token.__index = Token -- 关键:设置元表的__index指向Token -- Token initializer function Token:new(Type, Value, PosStart, PosEnd) local obj = setmetatable({}, self) -- 创建新对象,并绑定元表 obj.Type = Type obj.Value = Value or nil if PosStart then obj.PosStart = PosStart:Copy() obj.PosEnd = PosStart:Copy() end if PosEnd then obj.PosEnd = PosEnd:Copy() end return obj end function Token:repr() if self.Value ~= nil then return string.format("%s: %s", self.Type, self.Value) end return string.format("%s", self.Type) end return Token
关键修改点说明
- 原代码中
setmetatable({}, Token)没有保存新创建的对象,直接修改了self(也就是Token全局表),导致所有实例共享同一个表数据。 - 现在先创建独立的空对象
obj,将其元表绑定到Token,再给obj单独赋值属性,最后返回这个新对象,确保每个Token:new()都会生成独立实例。 - 添加
Token.__index = Token,保证新对象能访问Token表中的方法(比如repr)。
验证修复
修改后重新运行Tokenize函数,打印每个Token时会显示正确的独立内容,table.insert()也会正常追加元素,不会再出现"覆盖索引"的现象。
内容的提问来源于stack exchange,提问作者TheTrueBear
相关产品推荐
相关产品推荐

