【问题标题】:Appending nil to a Lua sequence将 nil 附加到 Lua 序列
【发布时间】:2015-04-20 00:01:16
【问题描述】:

假设我有一个序列:

a = { 10, 12, 13 }

这个序列的长度(#a)是3。

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

table.insert(a, nil)

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

这会对表格有任何影响吗?

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

在我检查过的 Lua(Lua 5.1、Lua 5.3)上,这不会影响表格。但我想知道这是否是我不能依赖的“未定义行为”。

手册只谈到将nil 添加到序列的中间,但没有(根据我的解释)谈到将其添加到结束 的序列。

【问题讨论】:

  • “将 nil 添加到序列的中间”会从表中删除键值对。如果它位于具有序列的表的序列中间,则该表将不再具有序列。
  • 即使一些假设的符合实现会“影响”表而不是什么都不做,结果表仍然是定义的序列。
  • 例如将 nil 分配给 last 序列键 影响 表,但之后它仍然是一个序列。

标签: lua lua-table


【解决方案1】:

nil 值添加到序列中,完全没有效果。事实上,一个表不能保存nil 的值。来自the manual

表可以是异构的;也就是说,它们可以包含所有类型的值(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}

【讨论】:

  • 为了清楚起见,这个答案中的第一个表有一个序列。第二个表没有(也就是说,它有正整数键,但它们不符合从 1 开始和连续的定义。)
  • @TomBlodget 你说得对,我并不清楚。试图指出nil 值实际上不在表中,这对于任何表都是正确的,而不仅仅是序列。我正在使用第二个示例,因为我假设 OP 在说 手册仅讨论在序列中间添加 nil 时指的是这个。我将进行编辑以使其更清晰。
【解决方案2】:

不,它不会影响表格。

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

它返回:

1
2
3

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2014-08-11
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2016-11-27
    • 2015-02-10
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多