4

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

(2回目の実行)

LD1
LD2
LD3
LD4
I1
I2
I3

lua 5.2 では、シーケンスはランダムな順序で表示されます。

(初回実行)

I1
I2
LD4
I3
LD1
LD2
LD3

(2回目の実行)

LD2
LD3
LD4
I3
I1
I2
LD1

lua 5.2 を使用するとこのエラーが発生するのはなぜですか?

4

3 に答える 3

5

Lua 5.1 と 5.2 の両方で、next関数(pairs関数が使用する)で次のことが言及されています。

数値インデックスであっても、インデックスが列挙される順序は指定されていません。

多くのプログラミング言語のハッシュベースの構造 (Lua テーブル) は、値の特定の (挿入) 順序を保証しないことに注意してください。

つまり、これはエラーではありません。テーブルに挿入された要素の特定の順序を期待するべきではありません。期待できる唯一の順序は、数値をキーとして使用し、テーブルに存在しない最初の整数キーまでペア ( )、( )、を反復処理するipairs関数を使用する場合です。1,t[1]2,t[2]...

于 2012-08-15T18:41:54.143 に答える
5

Lua 5.2.1 では、ハッシュ用のシードのランダム化が導入されました。

于 2012-08-15T18:56:52.160 に答える
4

テーブルの要素には特定の順序はありません。

数値インデックスを の特定のサブテーブルにマップするテーブルを作成する必要がありますsums。テーブルを使用してsums、サブテーブルとそれらの順序付けの両方を保持することもできます。

例えば:

-- create table with sum ids in a specific order
sums = { "LD1", "LD2", "LD3", "LD4", "I1", "I2", "I3" }

-- create subtables in sums for each id
for i,id in ipairs(sums) do
    sums[id] = {}
end

-- stick some data in the sum tables
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

-- show sum tables in order
for i,id in ipairs(sums) do
    print(id, sums[id])
end
于 2012-08-15T18:56:05.067 に答える