为什么在遍历Lua表时,值会随机丢失?
我在为一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。