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()
代码,没有它就不可能得到这个答案!
所以我有一个 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()
代码,没有它就不可能得到这个答案!