"[3] = 30" is overwritten by next sequential integer which is 3 as well. That's why you see 3 = 40.
t3 table has different order because in PUC Lua expressions in brackets ([3], [a], ["key"]) always goes to hash part. This is not true in LuaJIT btw.
On 12 Dec 2020, 12:17 +0300, Jasper Klein <jasper@klein.re>, wrote:
Hello,
I was experimenting with table constructors and saw some unexpected behaviour.
The code below initializes a table in 3 different ways.
t1 = { 10, 20, 30, 40 }
print( "--- t1 ipairs ---" )
for k, v in ipairs( t1 ) do print( k, v ) end
print( "--- t1 pairs ---" )
for k, v in pairs( t1 ) do print( k, v ) end
t2 = { 10, 20, [3] = 30, 40 }
print( "--- t2 ipairs --" )
for k, v in ipairs( t2 ) do print( k, v ) end
print( "--- t2 pairs ---" )
for k, v in pairs( t2 ) do print( k, v ) end
t3 = { [1] = 10, [2] = 20, [3] = 30, [4] = 40 }
print( "--- t3 ipairs ---" )
for k, v in ipairs( t3 ) do print( k, v ) end
print( "--- t3 pairs ---" )
for k, v in pairs( t3 ) do print( k, v ) end
The following output was generated when I execute it with Lua 5.4.1;
--- t1 ipairs ---
1 10
2 20
3 30
4 40
--- t1 pairs ---
1 10
2 20
3 30
4 40
--- t2 ipairs --
1 10
2 20
3 40
--- t2 pairs ---
1 10
2 20
3 40
--- t3 ipairs ---
1 10
2 20
3 30
4 40
--- t3 pairs ---
4 40
1 10
2 20
3 30
I expected that 't2' and 't3' are equivalent to 't1' but the output differs.
Especially the contents of 't2' is odd.
't3' behaves according to the documentation but the items seems to go into the hash part of the table.
However, the way how items are stored in a table is an implementation detail.
What behaviour for 't2' (and 't3') should I expect?
-- Jasper