For 循环在我的 table 中输入了太多值

For-loop is putting in too many values in my table

所以我有一个 for 循环:

for k, pt in pairs(points) do
    self.centers[k] = Center:new() --<centers> is part of my Map object, and Center is an object
    local bottomleft = Corner:new()
    table.insert(self.centers[k].corners, bottomleft)
    ...--repeats 4 times for each corner of a square
end

列表中有 256 个点(点),当我尝试检查每个中心对象在列表(中心)中有多少个值时,结果如下:

print(#self.centers[1].corners) --> 1024

我不知道为什么每个 (center.corners) 列表中的值都是 4 倍,而本应只有 4 个。

我该如何解决这个问题?

编辑:

function Center:new (o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

也就是Center:new()方法

当您创建一个新的 Center 对象时您设置

.__index = self

所以稍后当你索引时

self.centers[k].corners

在这一行

table.insert(self.centers[k].corners, bottomleft)

它 returns self 对象,导致你的角被插入我假设的 Center

鉴于您将 4 个角添加到同一个 table 256 次,它并不是将 1024 个角添加到每个 table,而是将它们添加到一个 table,一个你正在索引但你甚至没有意识到。

您的解决方案很简单,只需将角 属性 添加到每个中心:

function Center:new (o)
    o = o or {corners={}}
    setmetatable(o, self)
    self.__index = self
    return o
end

这是有效的,因为 __index 仅当索引 不存在于 table 已经 时才会触发。这将停止重定向。

P.S.: 感谢您提供 Center:new() 代码,没有它就不可能得到这个答案!