lua ipairs 和 parirs的区别

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值