取长度操作符写作一元操作#。字符串的长度是它的字节数(就是以一个字符一个字节计算的字符串长度)。
tablet的长度被定义成一个整数下标n。它满足t[n]不是nil而t[n+1]为nil;此外,如果t[1]为nil,n就可能是零。对于常规的数组,里面从1到n放着一些非空的值的时候,它的长度就精确的为n,即最后一个值的下标。如果数组有一个"空洞"(就是说,nil值被夹在非空值之间),那么#t可能是指向任何一个是nil值的前一个位置的下标(就是说,任何一个nil值都有可能被当成数组的结束)。
localtblTest2=
{
1,
a=2,
3,
}
print(table.getn(tblTest2))
这段代码输出的结果是多少?这里的输出结果应该是2。首先,要明白,这个ctblTest2c不是一个简单的ctable,它混合了列表(list)和记录(record)两种风格,表中,a=2是record风格。其次,要明白,record风格的record是不作为外表的长度计算。你可以把它想象成一个函数,跟其他面向对象语言一样,函数是不记为内部变量的。
既然像函数一样,那就可以输出a的值,是的。print(tblTest2.a)就可以了。
以下情况相当纠结,可直接看最后一句话总结:
现在来看一个比较纠结的:
localtblTest4=
{
1,
nil,
}
print(table.getn(tblTest4))
这段代码输出的结果是多少?是1。我们都知道table获取长度的时候,会遍历一下整个表,在最后一个非nil处,就会返回。
如果你继续往后面加nil,你可能会发现点什么。你可能认为你发现的是个规律。但是,你千万不要认为这是个规律。因为这是错误的。
1、在table中不要使用nil
2、如果非要使用nil,必须用table.setn()函数去设置这个table表的长度。注意:新版本的lua已经不支持setn了。
setn函数已过时,不要在lua的table中使用nil值,如果一个元素要删除,直接remove,不要用nil去代替。
上一篇:php计划任务怎么定时执行
下一篇:PHP文件打开乱码的解决方法