table 中插入空元素(nil),所以一般来讲,能够在用作序列的 table 上正确使用长度运算符(#),并且了解长度运算符(#)的局限性(只能正确作用于序列上)就足够了.
----
以下内容涉及实现细节...,讨论的示例也并不常见,仅想初步了解的朋友可以跳过阅读,否则容易引起混淆
进阶
接着上面的例子,我们再来看下这段代码:
local t = { 1, 1, nil, 1 }
print(#t) --...4
原因在于 Lua 的相关实现中,长度是从最大的数组索引处开始查找的,如果发现该处的元素不为空(nil),就直接向后查询....在上面的例子中, Lua 首先检查 t[4](t 的最大数组索引为 4),发现不是空元素,于是直接向后查询,发现不存在 t[5] 元素,于是便返回了 4(作为 table 的序列长度,下同)....高级
如果混合使用 table 中的 数组部分 和 hash部分,则长度运算符(#)的结果会更加复杂一些:
local t = { 1, 1, 1, 1, [5] = 1, [9] = 1 }
print