Lua - 表构造函数中的nils

Pla*_*met 4 lua lua-table

我有以下代码:

local ta = { nil, nil, nil, 1, a = 2 }
local tb = { [4] = 1, a = 2 }

for i = 1, #ta do
  print('ta['..i..']= ', ta[i])
end
for i = 1, #tb do
  print('tb['..i..']= ', tb[i])
end
Run Code Online (Sandbox Code Playgroud)

并获得以下输出:

ta[1]=  nil
ta[2]=  nil
ta[3]=  nil
ta[4]=  1
Run Code Online (Sandbox Code Playgroud)

我假设两个表都应该相同.但它并不完全.

我尝试使用空构造函数创建表,并逐个初始化元素,包括开头的nils.但是与表tb得到了相同的结果.

有什么区别?我可以手动管理吗?

W.B*_*.B. 7

在Lua中,#对于数组,长度运算符的行为是未定义的,其中序列被破坏,也就是说,它不是从1开始或内部有空槽.


Col*_*Two 5

虽然WB大多是正确的,因为长度运算符对于带孔的数组并不是非常一致,但它也不是未定义的.

表的长度在Lua手册中定义为"任何整数索引n,使得t[n]不是nilt[n+1]为零;此外,如果t[1]nil,n则可以为零".

这意味着长度{"a", nil, "b", nil, "c"}可以是1,3或5.因此,虽然长度运算符将不再为您提供非常有用和特定的结果,但它也不会给您带来垃圾.

  • 对于当前键值对等于**{1,nil,3,nil,5}的Lua表,长度运算符可以返回1,3或5**中的任何一个.是的,有关于可能结果的规则,但没有定义单个特定结果.最终,[每当一个操作需要一个表的长度时,该表应该是一个正确的序列或者有一个__len元方法](http://www.lua.org/manual/5.2/manual.html#6.5).(序列是[对于某些整数n,所有正数字键的集合等于{1..n}的表](http://www.lua.org/manual/5.2/manual.html#2.1) .) (2认同)