【问题标题】:'nil' as an element in a Lua table?'nil' 作为 Lua 表中的一个元素?
【发布时间】:2018-08-16 01:29:58
【问题描述】:

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

我不明白的是

以下代码打印3

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

但是下面的打印是4

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

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

【问题讨论】:

标签: lua lua-table


【解决方案1】:

您正在经历的是参数修剪。

让我们来看看你有什么,并解释当 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。

请参阅this answer here,因为您确实可以使用以下方法在表中表示 nil:

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

【讨论】:

  • 这可能也值得一看:https://www.lua.org/pil/5.2.html
  • 回复:第二个例子。 "value nil is not considered part of the table." 试试for k, v in pairs({1, nil, 3, 4}) do print(k, v) end
  • 函数不像某些语言那样“声明”。这需要一点不同的想法。 Vector 是一个变量,在您的代码中,它在执行第一行非注释代码后引用函数值。函数调用在括号前有一个表达式,它被评估,如果在运行时它产生一个函数值,则调用传递所有参数。在调用站点,没有关于被调用的函数值需要多少参数的内在概念。
【解决方案2】:

长度运算符# 对应于仅用于序列的数组长度的直观概念,即没有孔的数组。请参阅manual

【讨论】:

  • 1 的索引开始!如果您是 C/C++ 编码人员,并且当您开始从 API 的那一侧构建表时,您会天真地放入从 0 开始的 C 数组索引 - BTDT - 并得到 T 恤。 . 8-P
【解决方案3】:

这取决于您所说的“有效”。指向nil 的键等效于该键不在表中,因此表中未分配给所有键的无限数量都指向nil。如果您希望您的数据结构以这种方式工作,您当然可以将nil 视为有效值。

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

【讨论】:

  • # 始终如一地工作;这并不总是你所期望的:-)
猜你喜欢
  • 2015-05-06
  • 2013-10-06
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2012-08-01
  • 2021-07-15
  • 2017-09-20
  • 2023-04-02
相关资源
最近更新 更多