for循环在我的表中放了太多的值

所以我有一个for循环:

for k, pt in pairs(points) do
    self.centers[k] = Center:new()--<centers>是我的Map对象的一部分,Center是一个对象
    local bottomleft = Corner:new()
    table.insert(self.centers[k].corners, bottomleft)
    ...--每个正方形的4个角落重复4次
end

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

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

我不知道为什么每个(center.corners)列表中的值都有四倍之多,而实际上只应该有四个。

我该如何解决呢?

编辑:

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

这就是Center:new()方法

点赞
用户3979429
用户3979429

当你创建一个新的中心对象时,你设置:

.__index = self

所以当你索引

self.centers[k].corners

在这一行中

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

它返回 self 对象,导致你的角落被插入到我假设是“Center”的表中。

由于你要向相同的表中添加4个角落256次,它不是向每个表添加1024个角落,而是将它们添加到一个单一的表中,一个你正在索引并且甚至没有意识到的表中。

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

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

这样做可行的原因是 __index 仅在表中不存在索引时才触发。这可以防止重定向。

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

2017-04-04 14:12:01