lua中的table是一张hash表,遍历table是一个非常常见的操作,但是由于table其中的内容不同,其遍历方式也不尽相同;而且若使用了错误的遍历方式,还会导致意外中断遍历,让结果不符合预期。
本文主要是简单介绍一下lua table的几种遍历方式
lua常用的遍历方式有三种,使用ipairs遍历、使用pairs遍历、使用i=1,#xxx遍历
pairs根据tbtest中key的hash值排列的顺序来遍历,并非创建table时各个元素的顺序
for key, value in pairs(tbtest) do
XXX
end
ipairs会从table数组(lua的hash表和数组都是用的table)下标1开始,一直遍历到key不连续为止(即下表非数字)
for key, value in ipairs(tbtest) do
XXX
end
这种遍历依赖于#xxx获取到的长度,通常建议用于数组型table,且下表连续。否则可能表现不一致。或者容易取出nil值
for i=1, #(tbtest) do
XXX
end
说到这里,看一下两组验证代码:
tbtest1 = {
a = "a",
[1] = "1",
b = "b",
c = "c",
[2] = "2",
[4] = "4",
}
print("pairs(tbtest1)")
for key, value in pairs(tbtest1) do
print(tostring(key)..":"..tostring(value))
end
print("ipairs(tbtest1)")
for key, value in ipairs(tbtest1) do
print(tostring(key)..":"..tostring(value))
end
print("i=1,#(tbtest1)")
for i=1, #tbtest1 do
print(tostring(i)..":"..tostring(tbtest1[i]))
end
第一组,数组下标和字符串下标混用,这种混合的下标方式首先不建议这么写,如果table内容如此混乱的话,建议使用pairs进行遍历
输出结果:
pairs(tbtest1)
1:1
2:2
4:4
c:c
b:b
a:a
ipairs(tbtest1)
1:1
2:2
i=1,#(tbtest1)
1:1
2:2
3:nil
4:4
pairs可以遍历所有成员;ipairs只遍历1,2,数值型下标,下一个3不连续就中断了;由于#tbtest获取的值为4,故下标3的值为nil
看另一个例子
local tbtest2 = {}
for i=1, 5 do
tbtest2[i] = i
end
tbtest2[7] = 7
print("pairs(tbtest2)")
for key, value in pairs(tbtest2) do
print(tostring(key)..":"..tostring(value))
end
print("ipairs(tbtest2)")
for key, value in ipairs(tbtest2) do
print(tostring(key)..":"..tostring(value))
end
print("i=1,#(tbtest2)")
for i=1, #tbtest2 do
print(tostring(i)..":"..tostring(tbtest2[i]))
end
tbtest2[6] = 6
print("ipairs(tbtest2)")
for key, value in ipairs(tbtest2) do
print(tostring(key)..":"..tostring(value))
end
print("i=1,#(tbtest2)")
for i=1, #tbtest2 do
print(tostring(i)..":"..tostring(tbtest2[i]))
end
打印输出
pairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
7:7
ipairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
i=1,#(tbtest2)
1:1
2:2
3:3
4:4
5:5
ipairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
6:6
7:7
i=1,#(tbtest2)
1:1
2:2
3:3
4:4
5:5
6:6
7:7
pairs先按顺序输出值,然后再按键值对的hash顺序输出键值对
ipairs只会按照顺序输出值,若下标是nil值(也可以理解为下标不连续)则中断。
常用用法:pairs用于迭代元素,ipairs用于迭代数组
参照LUA手册的解释:
ipairs (t)
Returns three values: an iterator function, the table t, and 0, so that the construction
for i,v in ipairs(t) do body end
will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
pairs (t)
Returns three values: the next function, the table t, and nil, so that the construction
for k,v in pairs(t) do body end
will iterate over all key–value pairs of table t.
See function next for the caveats of modifying the table during its traversal.
ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key