Lua 5.2 修改了表中元素的顺序。

在 Lua 5.1 中,以下代码的执行结果如下:

sums = {
    ["LD1"] = { },
    ["LD2"] = { },
    ["LD3"] = { },
    ["LD4"] = { },
    ["I1"] = { },
    ["I2"] = { },
    ["I3"] = { }
}

for fld = 1, 22, 1 do
    table.insert( sums["LD1"] , 0 );
    table.insert( sums["LD2"] , 0 );
    table.insert( sums["LD3"] , 0 );
    table.insert( sums["LD4"] , 0 );
    table.insert( sums["I1"] , 0 );
    table.insert( sums["I2"] , 0 );
    table.insert( sums["I3"] , 0 );
end

for i,O in pairs(sums) do
    print(i)
end

执行结果为:

(第一次执行)

LD1
LD2
LD3
LD4
I1
I2
I3

(第二次执行)

LD1
LD2
LD3
LD4
I1
I2
I3

但是在 Lua 5.2 中,执行结果会以随机顺序呈现:

(第一次执行)

I1
I2
LD4
I3
LD1
LD2
LD3

(第二次执行)

LD2
LD3
LD4
I3
I1
I2
LD1

为什么在使用 Lua 5.2 时会出现这个错误?

点赞
用户50476
用户50476

Lua 5.1和5.2在next函数(pairs函数使用的函数)中提到了以下内容:

枚举索引的顺序没有指定,即使对于数字索引也是如此。

请注意,许多编程语言的基于哈希的结构(Lua表格也是如此)不保证值的任何特定(插入)顺序。

换句话说:这不是错误。您不应该期望您的表中插入的元素有任何特定的顺序。您唯一可以期望的顺序是当您使用数字作为键并使用ipairs函数时,它会迭代这些对:(1,t[1]),(2,t[2]), ...,直到表中不存在第一个整数键为止。

2012-08-15 18:41:54
用户501459
用户501459

在表格中没有规定元素的顺序。

你需要创建一个将数字索引映射到sums中的特定子表的表格。你甚至可以使用sums表来保存子表和其排序。

例如:

-- 创建一个按特定顺序排序的总和id表
sums = { "LD1", "LD2", "LD3", "LD4", "I1", "I2", "I3" }

-- 为每个id在sums中创建子表
for i,id in ipairs(sums) do
    sums[id] = {}
end

-- 在总和表格中插入一些数据
for fld = 1, 22 do
    table.insert( sums["LD1"] , 0 );
    table.insert( sums["LD2"] , 0 );
    table.insert( sums["LD3"] , 0 );
    table.insert( sums["LD4"] , 0 );
    table.insert( sums["I1"] , 0 );
    table.insert( sums["I2"] , 0 );
    table.insert( sums["I3"] , 0 );
end

-- 按顺序显示sum表格
for i,id in ipairs(sums) do
    print(id, sums[id])
end
2012-08-15 18:56:05
用户107090
用户107090

Lua 5.2.1 引入了一些用于哈希种子的随机化。

2012-08-15 18:56:52