【问题标题】:How do I avoid creating a nil reference in Lua when I remove an item from a table?从表中删除项目时,如何避免在 Lua 中创建零引用?
【发布时间】:2020-09-13 20:08:09
【问题描述】:

我是 Lua 的新手,我正在尝试使用 LOVE2D 创建一个视频游戏,其中玩家装饰在传送带上移动的比萨饼。玩家成功制作披萨后,他们会收到新订单并自动开始制作下一个披萨。

我遇到的问题是跟踪玩家与之交互的披萨对象。我创建了一个表来存放比萨饼,其中第一个索引处的项目是当前的比萨饼——玩家可以添加配料的那个。为了节省内存,我想在它离开屏幕后删除第一个索引处的披萨 (table.remove(pizzas, 1))。但是,这会导致错误“尝试索引零值”,我猜这是因为我在第一个索引处对项目有多个引用(例如,为了跟踪位置,pizzas[1].x,或为了跟踪奶酪,我有披萨[1].cheeseCount)。我该如何避免这种情况?非常感谢!

【问题讨论】:

  • 你如何过渡到下一个披萨?
  • @Nifim 我设置了 Pizzas[1] = Pizzas[2],然后通过 table.remove(pizzas, 1) 删除了第一项。
  • 当您致电table.remove 时,它会为您重新排列您的阵列。无需设置pizzas[1] = pizzas[2]lua.org/pil/19.2.html

标签: lua null lua-table love2d


【解决方案1】:

https://www.lua.org/manual/5.3/manual.html#pdf-table.remove

table.remove (list [, pos])

从列表中删除位置 pos 的元素,返回被删除元素的值。当 pos 是 一个介于 1 和 #list 之间的整数,它向下移动元素 list[pos+1], list[pos+2], ···, list[#list] 并擦除元素 列表[#list]; #list 为 0 或 #list + 时索引 pos 也可以为 0 1个;在这些情况下,该函数会删除元素列表[pos]。

pos的默认值为#list,所以调用table.remove(l) 删除列表 l 的最后一个元素。

所以你的问题很可能不是你索引第一个(删除的)披萨,而是你索引了一个已经向下移动的披萨,因此在其原始索引中不再存在。

local pizzas = {"A", "B", "C"}
table.remove(pizzas, 1)

现在您的表格如下所示:{"B", "C"}

pizzas[3] 将是nil

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多