Lua 根据序列中孔的大小以不同方式报告越界

Lua reports out of bounds differently based on size of a hole in a sequence

以下代码:

myList = {1, 5, 9, 10}
myList[8] = 8
table.remove(myList,8)

应该生成一个 table,边框位于 4,键 5 和键 6 为 nil,键 8 为 8,然后删除键 8。此程序有效。

但是,以下内容:

myList = {1, 5, 9, 10}
myList[9] = 8
table.remove(myList,9)

不行吗,说是table.remove的调用越界了!

这是矛盾的:myList[9]是一个非空条目,如果table.remove要求给定条目之前没有边框,那么4处的边框应该导致第一个例子也失败了。唯一不同的是键位的差距大了一级!

这里发生了什么,我可以纠正吗?

table 的数组部分(从 1 开始到第一个 nil 值结束的整数索引)是 table.remove 唯一有效的部分。数组部分不能有“空洞”;第一个“孔”代表数组的末尾。

如果您给 table.remove 索引不在 table 的数组部分,那么您会得到未定义的行为。也许有时它会“起作用”,有时却不会。解决方法是不在 table.

的数组部分之外指定索引