Skip to content

3.4.7 - 取长操作符

取长操作符表示为一元前缀 #

这里字符串的长度就是其字节数量。(通常每个字符为单字节时意味着字符串真实长度。)

表的取长操作返回表的边长(border)。表t边长是一个满足以下条件的非负整数:

lua
(border == 0 or t[border] ~= nil) and (t[border + 1] == nil or border == math.maxinteger)

简单来说,边长是表的一个正整数索引,它的下个索引刚好在表中不存在,然后再加上两条限制:当索引1不存在时,边长为0;以及所存在的索引值最大为整数值的最大值。注意表中存在的非正整数键不会影响其边长。

一个只有边长的表被称为序列(sequence)。例如,表 {10, 20, 30, 40, 50} 就是一个序列,因为它只有边长(5)以内的键。当表t并不是序列时,#t 也只会返回其边长。(确切地说它取决于表的内部表示,说回来又取决于表的填充方式和非数字键的内存地址。)

表长度计算的时间复杂度为O(log n),其中的n为表中的最大整数键。

在程序中可以通过__len元函数来更改除字符串之外的任意类型的取长操作。