level 1
t = {};
t[1] = "aa";
t[2] = "bb";
t[5] = "dd";
print(#t);
这个时候会打印2,表示数组长度是2。
但是如果我改一下。
t = {};
t[1] = "aa";
t[2] = "bb";
t[4] = "dd";
这时候就打印为4了,我明明t[3]是nil,长度应该依然是2才对,为什么打印为4呢。
搞不懂,求解释。
2014年06月03日 13点06分
1
level 2
这个是使用循环实现的。
要像你这么做表是要这么定义的
s={[0]=1,2,3,4}
print(s[0])
就行了
2014年06月05日 02点06分
4
我说的是长度计算,而且lua是从1开始计数的,你写这个我没搞明白跟我这个有什么关系
2014年06月05日 04点06分
level 2
我的意思是启始下标是可以自己定的,Lua的标准库默认是从1开始的。如果你不用循环实现,会出现问题。
其实它的下标相当于hasm表中索引,你是无法根据索引求表长的。
有两个原因:1.索引可能是一个字串符
opnames = {["+"] = "add", ["-"] = "sub",["*"] = "mul", ["/"] = "div"}
2.如果使用默认的,索引从1开始,即使这样,你能确定中间无间隔。
如:t={};t[1]=1;t[2]=3;t[5]=5;print(#t)的输出却是2,只有连续的才 可以是
正确的
长度
2014年06月05日 06点06分
5
(太长了,我发到下面回复里,麻烦看一下)
2014年06月05日 07点06分
level 1
你误解我意思了,你说的我明白,正常使用过程中肯定是要自己重新封装一个数组的,那么不存在长度计算异常的问题。
我的意思是对这个源生的计算方式感觉不明白,按照官方说法,忽略表中的key为字符这种情况,把它当成数组时,会从索引为1开始累加计数,遇到nil后则停止,忽略后面的元素。此时则为这个数组的有效长度。
那么我上面两段代码,第一段中,t[3]和t[4]都是nil,计算长度为2,这是正确的。第二段中,t[3]是nil,虽然t[4]有值,但是计算应该到t[2]后就终止,长度也应该是2才对,但是却输出为4,这个跟说明的计算方式不一致。
所以我困惑在这个地方,不明白是我理解错了,还是说lua这个最基础的计算方式有bug。
2014年06月05日 07点06分
6
#操作符是求sequence(序列)长度而不是求array(数组)的长度,楼主理解错了。
2014年06月09日 07点06分
level 2
官方的说明中,并没有找到这样的说明。但是表的长度计算,确定是一个bug。
使用官方求长度会让你摸不着头脑。
2014年06月05日 09点06分
7
level 10
没有必要去纠结这些,lua的自由度如此高,允许一些模糊的概念存在有何不可
2014年06月05日 12点06分
8
不纠结了,这自由度不是一般的高
2014年06月05日 12点06分
level 14
lua程序设计英文第三版也提到了这个问题,那里用的是几个疑问句而不是给出了确切的解答,然后说了一种只有最后几位是nil的特例(那种显然最后那几个nil不算进去的),最后面说有nil就得在list的最后。
2014年08月03日 02点08分
12
level 1
好奇怪
t = {};
t[1] = "aa";
t[3] = "bb";
t[4] = "dd";
print(#t)
结果为4,
,
t = {};
t[2] = "aa";
t[3] = "bb";
t[4] = "dd";
print(#t)
结果为也4,
t = {};
t[1] = "aa";
t[3] = "bb";
t[5] = "dd";
print(#t)
结果为1,
。。。。。
2015年01月06日 12点01分
13
level 1
lua 这么取数组长度会被 nil 截断的。
nil 之后的不被计算。
2015年02月28日 05点02分
14
level 1
站在bit位去理解#的作用就好些了。1248...2的整数次幂指数
2015年07月20日 06点07分
15
level 1
lua 先遍历数组部分 二分查找i array[i] == nil array[i+1] ~= nil ,如果数组部分最后一个位置不是nil,那么就认为 数组部分最大n 为数组长度,然后再去hash中查找
2018年02月02日 02点02分
19