【问题标题】:For-loop is putting in too many values in my tableFor-loop 在我的表中输入了太多的值
【发布时间】:2017-08-29 00:38:08
【问题描述】:

所以我有一个 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:new 返回的是同一个对象,这很容易解释。
  • 函数中心:new (o) o = o or {} setmetatable(o, self) self.__index = self return o end
  • 您是否为每个对象创建了Center.corners 表?我在Center 构造函数中看不到它。它要么在许多 Center 对象之间共享,要么您的代码应该在 table.insert(self.centers[k].corners, ..) 上失败并出现运行时错误。请参阅ideone.com/Fbvt4S 上的示例。另一个可能的问题是,如果您的points 没有被连续整数索引索引,那么使用self.centers[1] 检查第一个中心可能是不正确的,因为pairs() 可以返回不是数字的键,但是points 中的任何内容表。
  • 另外,关于效率的快速说明,每次创建中心对象时都会设置 self.__index 。你应该事先设置好,所以你不必将它粘贴在构造函数中

标签: arrays for-loop lua square


【解决方案1】:

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

.__index = self

所以稍后当你索引时

self.centers[k].corners

在这一行

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

它返回 self 对象,导致你的角插入到我认为是 Center 的地方

当您向同一张表添加 4 个角 256 次时,它不是向每个表添加 1024 个角,而是将它们添加到一个表中,您正在索引一个您甚至没有意识到的表。

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

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

这是因为 __index 仅在索引在表中不存在时触发。这将停止重定向。

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

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 2021-12-10
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多