lua5.4:长度操作符#详解

在lua中,#叫长度操作符,是一元前缀运算符,用来返回字符串(string)或者表(table)的长度。
1、对于字符串来说,其返回值是该字符串占有多少个字节。也就是当字符串中的一个字符占一个字节时,字符串的长度。
2、#作用于表时,返回的实际上是表的一个边界(border)。
一个表t的边界border,是一个满足下列条件的非负数:
(border ==0 or t[border] != nil) and (t[border+1]==nil or border ==math.maxinteger)

在lua5.4中,math.maxinteger=9223372036854775807.
这个条件的意思是说,一个边界是表中的满足下一个索引是nil的,但是本身的索引是有效的正整数,即t[border]!=nil,但是t[border+1]=nil。再加上两种特殊情况。当t[1]=nil时为0,当math.maxinteger的索引值存在,即t[math.integer]!=nil时为math.maxinteger.
当一个表只有一个边界时,叫做序列(sequence)。比如表 { 1 , 2 , 3 , 4 , 5 } \{1,2,3,4,5\} { 1,2,3,4,5}是一个序列,他只有一个边界5,而 { 1 , 2 , n i l , 4 } \{1,2,nil,4\} { 1,2,nil,4}不是序列,有两个边界2和4。在索引为3处的值为nil,也叫做一个洞(hole)。
#t返回的是表t的任意一个边界,具体的返回值跟表内部的表示细节有关,或者说依赖于表的非数值键(key)的内存地址有关。
#操作符的复杂度为 O ( log ⁡ n ) O (\log n) O(logn),n是表的最大整数键。
以下是几个例子:

--the version of lua is lua5.4.4
t={
    
    1,2,3,4,5}
print(#t) --output 5

t={
    
    1,2,nil,4}
print(#t) --output 4

t={
    
    nil,1,2}
print(t) --output 3

t={
    
    }
t[2]=1
t[3]=2
print(#t) --output 0

t={
    
    1,2,3}
print(#t) --output 3
t[7]=7
print(#t) --output 3
t[6]=6
print(#t) --output 7

猜你喜欢

转载自blog.csdn.net/watqw/article/details/124135824