Lua - 在表构造器中使用 nil

我有以下代码:

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

我认为这两个表应该是相同的。 但是它们并不完全相同。

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

有什么不同? 我能手动管理吗?

点赞
用户2198692
用户2198692

在 Lua 中,对于数组中序列被打破的情况,也就是序列不从 1 开始或者中间有空槽,长度操作符 # 的行为是未定义的。

2014-04-25 08:35:09
用户646619
用户646619

虽然W.B.大体上正确,即包含洞的数组长度运算符并不是很一致,但也不是未定义的。

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

这意味着{"a", nil, "b", nil, "c"}的长度可以是1、3或5。因此,尽管长度运算符将不再给您一个非常有用和具体的结果,但它也不会给您垃圾。

2014-04-25 15:45:54
用户3574628
用户3574628

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

-- 数组部分。此循环将在遇到nil数组元素时停止。
local length = 0
for key, value in ipairs(t) do
  length = key
  -- 进行处理。
end

-- 哈希部分。
for key, value in pairs(t) do
  -- 检查键是否在我们已处理的数组中。
  if type(key) ~= 'number' or key < 1 or key > length or key ~= math.floor(key) then
    -- 进行处理。
  end
end
2014-04-25 22:26:39