'nil' 作为 Lua table 中的一个元素?

'nil' as an element in a Lua table?

我想知道 nil 是否是 Lua 中的 table 中的有效元素。

我不明白的是

以下代码打印 3

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

但是下面的打印 4

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

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

您遇到的是参数修剪。

让我们 运行 了解您拥有的内容,并解释 Lua 解析它时发生了什么。

-- T is equal to 1, 2, 3, (NOTHING)
-- Therefore we should trim the nil from the end.
t = {1, 2, 3, nil};

-- T is equal to 1, nil, 3, 4
-- We have something on the end after nil, so we'll count nil as an element.
t = {1, nil, 3, 4};

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

-- We declare a function with x and y as it's parameters.
-- It expects x and y.
function Vector(x, y) print(x, y); end

-- But... If we add something unexpected:
Vector("x", "y", "Variable");
-- We'll encounter some unexpected behaviour. We have no use for the "Variable" we handed it.
-- So we just wont use it.

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

参考,因为您确实可以使用以下方法在table中表示nil:

--  string  int   nil
t = {"var", "1", "nil"};

长度运算符#对应于数组长度的直观概念,仅适用于序列,即没有空洞的数组。见 manual.

这取决于你所说的 "valid" 是什么意思。指向 nil 的键等同于不在 table 中的键,因此 table 中未分配给所有键的无限数量的键都指向 nil。如果您希望数据结构以这种方式工作,您当然可以将 nil 视为有效值。

正如 lhf 在他的回答中所说,如果 nil 出现在数组中最后一个非 nil 元素之前,则 # 运算符无法始终如一地工作。如果您打算将 table 视为 sequence(与 lhf 发布的 link 相同),则 nil 不是有效的数组元素。