将nil附加到Lua序列

将nil附加到Lua序列,lua,lua-table,Lua,Lua Table,假设我有一个序列: a = { 10, 12, 13 } 此序列的长度(#a)为3 现在,假设我执行以下操作: table.insert(a, nil) (或a[#a+1]=nil) 这会对桌子产生任何影响吗 这个问题的答案是决定性的,还是“未定义的行为” 在我检查过的Luas(Lua5.1,Lua5.3)上,这不会影响表。但我想知道这是否是我无法依赖的“未定义的行为” 这本手册只谈到将nil添加到序列的中间,但它没有(根据我的解释)提到将其添加到序列的末端。将nil的值添加到序列中根本没有

假设我有一个序列:

a = { 10, 12, 13 }
此序列的长度(
#a
)为3

现在,假设我执行以下操作:

table.insert(a, nil)
(或
a[#a+1]=nil

这会对桌子产生任何影响吗

这个问题的答案是决定性的,还是“未定义的行为”

在我检查过的Luas(Lua5.1,Lua5.3)上,这不会影响表。但我想知道这是否是我无法依赖的“未定义的行为”


这本手册只谈到将
nil
添加到序列的中间,但它没有(根据我的解释)提到将其添加到序列的末端

nil
的值添加到序列中根本没有效果。事实上,表不能包含
nil
的值。发件人:

表可以是异构的;也就是说,它们可以包含所有类型的值(除了
nil
)。任何值为
nil
的键都不被视为表的一部分。相反,任何不属于表的键都有一个关联值
nil

因此,表
{10,12,13,nil}
等价于
{10,12,13}
,两者都是序列


类似地,一个非序列示例:一个表
{10,20,nil,40}
相当于
{[1]=10,[2]=20,[3]=nil,[4]=40}
{[1]=10,[2]=20,[4]=40}
不,它不影响表

t = {1,2};
table.insert(t,nil);
table.insert(t,3);
for k,v in ipairs(t) do print(v) end
它返回:

1
2
3

为了清楚起见,这个答案中的第一个表有一个序列。第二个表没有(也就是说,它有正整数键,但它们不符合从1开始和连续的定义。)@TomBlodget你是对的,我不清楚这一点。试图指出
nil
值实际上不在表中,这对于任何表都是正确的,而不仅仅是序列。我之所以使用第二个例子,是因为我认为OP在说手册只谈到在序列中间添加一个nil时引用了这一点。我将进行编辑以使其更清楚。“在序列中间添加nil”将从表中删除键值对。如果在一个表的序列中有一个序列,则该表将不再有序列。即使一些假设一致的实现会影响表而不是只做什么,结果表仍然是按定义定义的序列。将nil赋值给最后一个序列键会影响表,但之后它仍然是一个序列。