lua table.remove引发的偶现bug
故事背景,两只宠物育种的时候要从背包删除,放入育种栏。育种完成再放回背包。现在育种完成背包多了一只。调试发现是删除的时候少删除了一只。
if source_list_a == take_list thentable.remove(take_list, index_a)
elsetable.remove(ware_list, index_a)
end
if source_list_b == take_list thentable.remove(take_list, index_b)
elsetable.remove(ware_list, index_b)
end如果a在b的前面,那么b remove会失败,remove后b的index_b其实已经改变了.
其实这个bug是ai写的,下面的代码也是ai改的
-- 先移除索引较大的宠物,再移除索引较小的,避免索引变化问题
local remove_indices = {}
if source_list_a == take_list thentable.insert(remove_indices, {list = take_list, index = index_a})
elsetable.insert(remove_indices, {list = ware_list, index = index_a})
end
if source_list_b == take_list thentable.insert(remove_indices, {list = take_list, index = index_b})
elsetable.insert(remove_indices, {list = ware_list, index = index_b})
end
-- 按索引从大到小排序,先移除索引大的
table.sort(remove_indices, function(a, b)return a.index > b.index
end)
-- 按排序后的顺序移除
for _, remove_info in ipairs(remove_indices) dotable.remove(remove_info.list, remove_info.index)
end