插入位置错误 - 为什么 lua 表的行为方式?



我需要按特定顺序将元素添加到lua表中,并尝试将每个元素插入其最终位置(但以随机顺序(。我是lua的新手,以前没有使用过table.insert(只阅读表同时支持关联和数组形式(,但我很确定它不能以这种方式工作,所以我做了一个小测试:

local test = {}
table.insert(test, 5, "5")
table.insert(test, 1, "1")
table.insert(test, 4, "4")
table.insert(test, 3, "3")
table.insert(test, 2, "2")

每个插入后的测试输出提供了以下有趣的行为:

["5"]
["5","1"]
["1","4","5"]
["1","3","4","5"]
["1","2","3","4","5"]

实际上它的效果比预期的要好(我认为插入到位置 4 处有两个元素的表格可能会附加(,但第 2 行和第 3 行让我完全困惑。在位置 1 处插入将追加,下一个插入将重新排序其他元素?!?

接下来的尝试是避免使用table.insert,而是使用test[5] = "5"等。 结果一模一样...

修复它的唯一方法是先用空字符串初始化元素 1 到 5,然后以随机顺序插入实际值。

有人知道为什么桌子会这样吗?

您的操作不会明智地应用于没有序列的表。第一条语句创建一个没有序列的表。然后一切都向南发展。

6.6 – 表操作

请记住,每当操作需要表的长度时,有关长度运算符的所有警告都适用(参见 §3.4.7(。

人们通常选择是否维护表的顺序。如果没有,请避免使用为序列设计的函数和 # 运算符(它是内置实现(。

您可以按照@lhf所述构建表格:

local test = {}
test[5] = "5"
test[1] = "1"
test[4] = "4"
test[3] = "3"
test[2] = "2"

然后在您确信已创建具有序列的表时,开始将表视为序列。

最新更新