您的位置:首页 > 编程语言 > Lua

lua 中pairs 和 ipairs区别

2015-10-13 10:26 441 查看

标准库提供了集中迭代器,包括迭代文件每行的(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, 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以及pairs 的不同。
 
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
 
但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
 

[cpp]
view plaincopyprint?

下面举个例子吧!  
   
 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  
   
那么,如果是  
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  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: