Lua表中能否将 nil 作为一个元素?

我在想在Lua表中能否将 nil 作为一个有效元素。

我不明白的是

下面的代码输出 3

t = {1, 2, 3, nil};
print(#t);

但是下面的输出 4

t = {1, nil, 3, 4};
print(#t);

我不明白为什么两段代码会有不同的输出结果。

点赞
用户9622872
用户9622872

你所经历的是参数截取。

让我们来看看你所拥有的,并解释Lua在解析时发生了什么。

-- T等于1, 2, 3, (NOTHING)
-- 因此我们应该从末尾截掉nil。
t = {1, 2, 3, nil};

-- T等于1, nil, 3, 4
-- nil后面有东西,所以我们将nil视为一个元素。
t = {1, nil, 3, 4};

在函数中也会发生同样的事情。有时这可能会有点麻烦,但有时也很方便。例如,请看下面的例子:

-- 我们声明一个具有x和y作为参数的函数。
-- 它期望x和y。
function Vector(x, y) print(x, y); end

-- 但是...如果我们添加一些意外的东西:
Vector("x", "y", "Variable");
-- 我们会遇到一些意外的行为。我们不需要我们递交的"Variable"。
-- 因此我们不会使用它。

反之亦然。如果您提交了需要X、Y和Z的函数,但是您只提交了X和Y,则您将传递nil而不是Z。

请参阅此答案,因为您确实可以使用以下方式在表中表示nil:

--  string  int   nil
t = {"var", "1", "nil"};
2018-08-15 05:53:39
用户107090
用户107090

# 运算符只对没有空洞的数组序列有着直观的长度概念。参见手册

2018-08-15 11:40:56
用户3574628
用户3574628

这要取决于你对“valid”是什么意思。指向nil的键等价于该键不在表中,因此表中无数个未分配的键都指向nil。如果您打算让数据结构以此方式工作,则可以将nil作为有效值。

正如lhf在他的答案中所说,如果nil出现在数组中的最后一个非nil元素之前,则#运算符无法一致地工作。如果您打算将表视为序列(与lhf发布的同一链接),则nil不是有效的数组元素。

2018-08-15 17:29:58