我是 Lua 的新手,这些天我正在学习 table 的用法。从tutorials我知道Lua对数字索引项和非数字索引项的处理是不同的,所以我自己做了一些测试,今天我发现了一个有趣的现象,我无法解释:
编码
t = {1, 2, 3, a='a', b='b'}
print(#t)
得到
3
因为#
操作员只计算数字索引项。然后我测试了以下代码
t = {1, 2, 3, a='a', b='b'}
print(#t)
for i = 100,200 do
t[i] = i
end
print(#t)
我明白了
3
3
到目前为止,我认为 Lua 将后来添加的那些不连续项视为非数字索引项。但是,在我稍微更改代码之后
t = {1, 2, 3, a='a', b='b'}
print(#t)
for i = 100,300 do
t[i] = i
end
print(#t)
我明白了
3
300
我对这种现象感到困惑,有人知道原因吗?谢谢。
(此现象可在http://www.lua.org/cgi-bin/demo重现)
更新:
我试过这段代码
t = {1, 2, 3, a='a', b='b'}
print(#t)
for i = 100,300 do
t[i] = i
print("add", i, #t)
end
for i = 100,300 do
t[i] = nil
print("del", i, #t)
end
我明白了
3
add 100 3
add 101 3
add 102 3
...
add 223 3
add 224 3
add 225 3
add 226 226
add 227 227
add 228 228
...
add 298 298
add 299 299
add 300 300
del 100 300
del 101 300
del 102 300
...
del 253 300
del 254 300
del 255 300
del 256 3
del 257 3
del 258 3
...
del 298 3
del 299 3
del 300 3
这个例子表明 Lua 确实在稀疏和密集之间转换了一个表。