为什么在遍历Lua表时,值会随机丢失?

编程语言 2026-07-10

我在为一个Roblox游戏写一个小工具。这只是服务端Lua,不是执行器相关的东西。我在对值列表进行筛选,然后再用于生成逻辑。我想直接从表中移除小于5 的数字,但有些值会被跳过。

local t = {1,7,2,9,3,8,4,6}

for i,v in ipairs(t) do
    if v < 5 then
        table.remove(t, i)
    end
end

for i,v in ipairs(t) do
    print(i, v)
end

预期输出应该是
7 8 9 6

但相反地,我有时仍会在表中看到本应被移除的值。看起来是在移除后跳过了条目。是不是因为ipairs+table.remove在移动索引时?在不分配新表的情况下原地筛选的正确方法是什么?

解决方案

是的,在遍历时你通过移动索引来跳过表中的元素。

这可以通过把示例表改成以下形式来演示:

local t = {1,7,2,-1,9,3,8,4,6}

-1 将仍然保留在结果表中,因为在遇到 2 值时,表发生移动从而被跳过。

就地解决方案:反向遍历。任何索引的移动都会发生在已经检查过的表的那一部分。

local t = { 1, 7, 2, -1, 9, 3, 8, 4, 6 }

for i = #t, 1, -1 do
    if t[i] < 5 then
        table.remove(t, i)
    end
end

for i, v in ipairs(t) do
    print(i, v)
end

结果:

1   7
2   9
3   8
4   6
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章