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_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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值