'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
不是有效的数组元素。
我想知道 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。
参考
-- string int nil
t = {"var", "1", "nil"};
长度运算符#
对应于数组长度的直观概念,仅适用于序列,即没有空洞的数组。见 manual.
这取决于你所说的 "valid" 是什么意思。指向 nil
的键等同于不在 table 中的键,因此 table 中未分配给所有键的无限数量的键都指向 nil
。如果您希望数据结构以这种方式工作,您当然可以将 nil
视为有效值。
正如 lhf 在他的回答中所说,如果 nil
出现在数组中最后一个非 nil
元素之前,则 #
运算符无法始终如一地工作。如果您打算将 table 视为 sequence(与 lhf 发布的 link 相同),则 nil
不是有效的数组元素。