为什么对于局部t = {1,[1] =“ a”,[2] =“ b”} t [1]输出为1

Mos*_*ito 3 lua

测试代码:

local t = {1, [1] = "a", [2] = "b"}
print("t[1]: ", t[1])
for _, v in pairs(t) do
    print(v)
end
Run Code Online (Sandbox Code Playgroud)

输出:

t[1]: 1
1
b
Run Code Online (Sandbox Code Playgroud)

lhf*_*lhf 8

如果您有重复的键,则未定义在表构造函数中设置字段的顺序。

当前,编译器将批处理列表项(每批50个列表项)。

通过luac -l在脚本上运行,可以看到构造函数的字节码:

1   [1] NEWTABLE    0 1 2
2   [1] LOADK       1 -1    ; 1
3   [1] SETTABLE    0 -1 -2 ; 1 "a"
4   [1] SETTABLE    0 -3 -4 ; 2 "b"
5   [1] SETLIST     0 1 1   ; 1
Run Code Online (Sandbox Code Playgroud)

注意最后的SETLIST。对于{10,20,30, [1] = "a", [2] = "b"},字节码为:

1   [1] NEWTABLE    0 3 2
2   [1] LOADK       1 -1    ; 10
3   [1] LOADK       2 -2    ; 20
4   [1] LOADK       3 -3    ; 30
5   [1] SETTABLE    0 -4 -5 ; 1 "a"
6   [1] SETTABLE    0 -6 -7 ; 2 "b"
7   [1] SETLIST     0 3 1   ; 1
Run Code Online (Sandbox Code Playgroud)

如果构造函数以长度为60的列表开头,则t [1]的最终值为“ a”。

  • 引用:[“未定义构造函数中的分配顺序。(此顺序仅在重复键时才相关。)”](https://www.lua.org/manual/5.3/manual.html# 3.4.9)(您的手册是使Lua伟大的一部分。) (2认同)