lua table.remove的小细节

table.remove的api定义如下:

table.remove(table [, pos])

返回table数组部分位于pos位置的元素,其后的元素会被前移。pos参数可选,默认为table长度,即从最后一个元素删起。

所以,根据api,下面的例子会引发一些bug:

luat_Test2={123, 456, 789}
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
for i, v in ipairs(luat_Test2) do
	print(i, v)
	local result = table.remove(luat_Test2, i);
	print(result)
end
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
for i, v in ipairs(luat_Test2) do
	print(i, v)
end

看结果:

lua table.remove的小细节_第1张图片

上面的代码,其功能是想清除lua_Test2表,但是第二个循环还是有数据打印出来。

分析一下,第一个for循环里,执行一次remove后,lua_Test2表的数据是这样的{456,789},注意:此时,lua_Test2的长度只有2。456的key是1;789的key是2。

第二次remove前,i=2,lua_Test2的长度为2所以还有一可以执行一次remove;执行remove后,lua_Test的长度为1。

第三次remove前,i=3,lua_Test2的长度为1,不满足循环条件,跳出。


这样的bug其实就是api中的其后的元素会被前移这句话。


最后,总结:避免在ipairs循环中remove。如果是删除整个表的话可以用lua_Test2 = nil。

你可能感兴趣的:(lua,回顾学习资料)