Lua - 表构造函数中的nils

时间:2014-04-25 07:47:30

标签: 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

获得以下输出:

ta[1]=  nil
ta[2]=  nil
ta[3]=  nil
ta[4]=  1

我认为两个表都应该相同。但事实并非如此。

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

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

虽然W.B.大多数是正确的,因为长度运算符对于带孔的数组来说不是很一致,它也不是未定义的。

表的长度在Lua manual中定义为“任何整数索引nt[n]不是nilt[n+1]是零;此外,如果t[1]nil,则n可以为零。“

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

答案 2 :(得分:4)

使用ipairs()处理数组部分并跟踪您处理的最后一个索引。然后你可以使用pairs()来处理其余的元素。

-- The array part. This loop will stop when it reaches a nil array element.
local length = 0
for key, value in ipairs(t) do
  length = key
  -- Process it.
end

-- The hash part.
for key, value in pairs(t) do
  -- Check if the key is in the array we already processed.
  if type(key) ~= 'number' or key < 1 or key > length or key ~= math.floor(key) then
    -- Process it.
  end
end