pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
下面举个例子:
- local tabFiles = {
- [3] = "test2",
- [6] = "test3",
- [4] = "test1"
- }
- for k, v in ipairs(tabFiles) do
- print(k, v)
- end
猜测它的输出结果是什么呢?根据刚才的分析,它在 ipairs(tabFiles) 遍历中,当key=1时候value就是nil,所以直接跳出循环不输出任何值。
- >lua -e "io.stdout:setvbuf 'no'" "test.lua"
- >Exit code: 0
那么,如果是
- for k, v in pairs(tabFiles) do
- print(k, v)
- end
则会输出所有:
- >lua -e "io.stdout:setvbuf 'no'" "test.lua"
- 3 test2
- 6 test3
- 4 test1
- >Exit code: 0
现在改变一下表内容,
- local tabFiles = {
- [1] = "test1",
- [6] = "test2",
- [4] = "test3"
- }
-
- for k, v in ipairs(tabFiles) do
- print(k, v)
- end
现在的输出结果显而易见就是key=1时的value值test1
- >lua -e "io.stdout:setvbuf 'no'" "test.lua"
- 1 test1
- >Exit code: 0
- -- [[示例1.]] --
- local tt =
- {
- [1] = "test3",
- [4] = "test4",
- [5] = "test5"
- }
-
- for i,v in pairs(tt) do -- 输出 "test4" "test3" "test5"
- print( tt[i] )
- end
-
- for i,v in ipairs(tt) do -- 输出 "test3" k=2时断开
- print( tt[i] )
- end
-
- -- [[示例2.]] --
- tbl = {"alpha", "beta", [3] = "uno", ["two"] = "dos"}
-
- for i,v in ipairs(tbl) do --输出前三个
- print( tbl[i] )
- end
-
- for i,v in pairs(tbl) do --全部输出
- print( tbl[i] )
- end