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.
的数组部分之外指定索引
以下代码:
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.