从官方参考手册可以看出:
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.
就是返回3个值:迭代函数,表t,和0。
对于
for i,v in ipairs(t) do body end
将会迭代 (1,t[1]
), (2,t[2]
), ···, (注意:举得例子是从key=1开始),直到第一个不是整数的key离开。
另外的手册写到:returns an iterator getting index, value pairs of array t in numerical order。
这句解释的更清晰了:以数字顺序遍历表的index,value,并返回迭代器。
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.
返回三个值:下一个函数,表,nil
对于
for k,v in pairs(t) do body end
函数next是在迭代过程中修改表的依据。
另外的手册里写到:returns an iterator getting key, value pairs of table t in an unspecified order
以不确定的顺序遍历key,value,并返回迭代器。
其中next函数值得看看:
next (t [, inx]) |
if inx is nil [default] returns first index, value pair of table t ; if inx is the previous index returns next index, value pair or nil when finished. |
如果inx是空,则返回table的第一组index,value;如果inx是前一个index,就返回下一个index,value,当然结束时返回nil.
好了,我们做些实验:
1.
local tabFiles = { [1] = "test2", [6] = "test3", [4] = "test1" } print("For ipairs:") for k, v in ipairs(tabFiles) do print(k,v) end print("For pairs:") for k, v in ipairs(tabFiles) do print(k, v) end
输出是:
>lua -e "io.stdout:setvbuf 'no'" "LuaChapter7.lua"
For ipairs:
1 test1 nil
2 test2 nil
3 test3 nil
For pairs:
1 test1 nil
2 test2 nil
5 test5 nil
3 test3 nil
>Exit code: 0
从上面输出看出,ipairs遍历了key:1,2,3而到5时停止了,也跟前面的文档说的一样是按照数字序列的,也就是连续的,一旦遇到不连续的就退出。
2.看看iparis能否对非整数key的数字key输出:
local tabFiles = { [1.22] = "test1", [2.3] = "test2", ["3"] = "test3", ["5"] = "test5" } print("For ipairs:") for k, v,x in ipairs(tabFiles) do print(k,v,x) end print("For pairs:") for k, v,x in pairs(tabFiles) do print(k, v,x) end
输出为:
>lua -e "io.stdout:setvbuf 'no'" "LuaChapter7.lua"
For ipairs:
For pairs:
2.3 test2 nil
1.22 test1 nil
3 test3 nil
5 test5 nil
>Exit code: 0
说明iparis对非整数key不能输出。
3.文档还说iparis输出有顺序,前面看到从1,2,3可以输出,说明按升序可以,那么降序呢?
local tabFiles = { [24] = "test1", [23] = "test2", ["3"] = "test3", ["5"] = "test5" } print("For ipairs:") for k, v,x in ipairs(tabFiles) do print(k,v,x) end print("For pairs:") for k, v,x in pairs(tabFiles) do print(k, v,x) end
输出为:
For ipairs:
For pairs:
24 test2 nil
23 test1 nil
3 test3 nil
5 test5 nil
>Exit code: 0
可以看出必须是升序。
4.那iparis是不是必须从1开始呢?因为文档说(1,table【1】)(2,table[2])
local tabFiles = { [2] = "test1", [1] = "test2", [4] = "test4", ["3"] = "test3", ["5"] = "test5" } print("For ipairs:") for k, v,x in ipairs(tabFiles) do print(k,v,x) end print("For pairs:") for k, v,x in pairs(tabFiles) do print(k, v,x) end
输出为:
>lua -e "io.stdout:setvbuf 'no'" "LuaChapter7.lua" For ipairs: 1 test2 nil 2 test1 nil For pairs: 2 test1 nil 3 test3 nil 1 test2 nil 4 test4 nil 5 test5 nil >Exit code: 0
从结果看table的key有2,1,4等3个整数key,顺序是乱的,但iparis按升序输出了key1,2就停止了,说明了整数key可以是乱序的,但必须是连续的(从1开始)。有间断即中断返回。
5看如果key为非数字时:
local tabFiles = { ["1"] = "test1", ["2"] = "test2", ["3"] = "test3", ["5"] = "test5" } print("For ipairs:") for k, v,x in ipairs(tabFiles) do print(k,v,x) end print("For pairs:") for k, v,x in pairs(tabFiles) do print(k, v,x) end
输出为:
>lua -e "io.stdout:setvbuf 'no'" "LuaChapter7.lua"
For ipairs:
For pairs:
1 test1 nil
5 test5 nil
3 test3 nil
2 test2 nil
>Exit code: 0
ipairs没有输出,pairs仍然全部输出了。
结论:pairs的用处更广泛点,能输出任意key,value的table;而iparis只能输出包含整数key且包含key=1连续的key,value。