lua 中pairs 和 ipairs区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的?
(string.gmatch)等等。LUA手册中对与pairs,ipairs解释如下:
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(t)
Returns three values: the?next
?function,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以及pairs 的不同。
?
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
?
但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
?
- 下面举个例子吧!??
- ???
- ?eg:??
- 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??
- 那么,如果是??
- 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",108); list-style:decimal-leading-zero outside; color:inherit; line-height:20px; font-size:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [6]?=?"test2",248); line-height:20px; font-size:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [4]?=?"test3"??
- }??
- 现在的输出结果显而易见就是key=1时的value值test1??
- ?>lua?-e?"io.stdout:setvbuf?'no'"?"Test.lua"???
- 1?test1??
- >Exit?code:?0???
- --[示例1.]--??
- local?tt?=??
- {??
- ????[1]?=?"test3",108); list-style:decimal-leading-zero outside; color:inherit; line-height:20px; font-size:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????[4]?=?"test4",248); line-height:20px; font-size:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????[5]?=?"test5"??
- ??
- for?i,v?in?pairs(tt)?do????????--?输出?"test4"?"test3"?"test5"??
- ????print(?tt[i]?)??
- do????--?输出?"test3"?k=2时断开??
- ??
- --?[[示例2.]]?--??
- tbl?=?{"alpha",?"beta",?[3]?=?"uno",?["two"]?=?"dos"}??
- do????--输出前三个??
- ????print(?tbl[i]?)??
- do????--全部输出??
- end??
http://www.cppblog.com/wc250en007/archive/2011/12/16/162203.html