先看一段简单的代码:

local mytable = {1,2,aa = "abc",subtable = {},4,6
}
--for循环1
print("for --- index")
for i=1,#mytable doprint(i)
end--for循环2
print("for ---- index-value")
for i,v in ipairs(mytable) doprint(i,v)
end--for循环3
print("for ---- key-value")
for k,v in pairs(mytable) doprint(k,v)
end

输出结果:

for --- index
1
2
3
4
for ---- index-value
1    1
2    2
3    4
4    6
for ---- key-value
1    1
2    2
3    4
4    6
subtable    table: 0x7f82d8d07660
aa    abc

3种for循环的结果各不相同,我们这里对后两种进行一下比较。

看一下,关于pairs和ipairs的定义:

pairs (t)

If t has a metamethod __pairs, calls it with t as argument and returns the first three results from the call.

Otherwise, 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.

  1. 如果table 含有元方法__pairs,返回它的前三个结果;
  2. 否则,返回函数next,table,nil;
  3. 会迭代table中所以键值对;

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 key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value.

  1. 返回一个迭代器函数,table,0;
  2. 会从key=1开始迭代table中的键值对,直到遇到第一个nil value;

例如:

local mytable2 = {[2] = "b",[3] = "c"
}
for i,v in ipairs(mytable2) doprint(i,v)
end

这里什么都不会输出,当迭代key=1的键值对时,value=nil,直接跳出;

所以:

  1. 使用pairs(t)会遍历所以key-value,但是它是无序的(不保证按照table元素的列举顺序遍历,和key的哈希值有关);
  2. 使用ipairs(t)会从key=1,2,3...这样的顺序遍历,保证顺序,不保证遍历完全;

所以要根据不同的需求,使用不同的方法。

转载于:https://www.cnblogs.com/zzya/p/5778125.html

Lua-泛型for循环 pairs和ipairs的区别相关推荐

  1. Lua中 pairs 和 ipairs 的区别

    Lua中 pairs 和 ipairs 的区别 在我看来,pairs就是粗略计算,ipairs就是仔细计算. pairs只关注存在还是不存在,而ipairs还要关注存在是否合理. pairs将存在的值 ...

  2. lua中, pairs和ipairs的区别

     函数pairs和ipairs都是实现遍历功能的函数,通常使用方法是和for函数共同使用构造for u,v in pairs/ipairs(t)实现遍历t表中的所有元素对.  区别在于,pairs可以 ...

  3. pairs和ipairs的区别

    在lua中ipairs 和pairs均可以用来遍历集合,但是两者有区别: 同:都是能遍历集合(表.数组),两者均优先按顺序输出没有key的值: 异:对于有key的集合: ipairs从第一个数字key ...

  4. lua中pairs和ipairs的区别

    在lua中,pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil; 但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出.它只能遍历到表中出现的第一个 ...

  5. Lua语言中pairs和ipairs的区别

    tbl = {"alpha", "beta", ["one"] = "uno", ["two"] = ...

  6. for循环中pairs与ipairs的区别与联系

    其实区别非常的简单: pairs:pairs可以遍历table中所有的key和value. ipairs:下标从1开始遍历table,然后累加1,如果某个元素下标不存在就终止遍历,这就导致如果下标不是 ...

  7. Lua中,泛型for循环遍历table时,ipairs和pairs的区别

    根据table型变量key是否为连续数字,如果是则称为数组型table,如果不是则称为非数组型table. 事实胜于雄辩,接下来通过实验来区分两组迭代器的区别. 首先给出pairs和ipairs在数组 ...

  8. 泛型lua的for循环以及lua的特殊的dowhile循环

    范型for循环: -- print all values of array 'a' a={1,2,3,4,5,6,7}; for i,v in ipairs(a) do print(v) end 范型 ...

  9. Lua——迭代器的使用、pairs 和 ipairs区别

    --迭代器是一种可以便利一种集合中所有元素得机制 --lua中,迭代器表示为函数,每调用一次函数,即返回集合中得下一个元素 --主要是根据闭合函数来实现得:闭合函数:一个函数加上该函数所需要访问得所有 ...

最新文章

  1. mysql远程权限grant_mysql 赋给用户远程权限 grant all privileges on
  2. C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
  3. 013_Vue监听器
  4. jdk安装好后没有jre,手动生成jre
  5. linux下的crontab
  6. c语言规定在一个源程序中main函数的位置是什么?
  7. P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles(记忆化搜索)--- 89分
  8. php 汉字转拼音及获取拼音首字母
  9. poj2752Seek the Name, Seek the Fame【kmp next数组应用】
  10. ORACLE的SQL练习---7. 拼接字符串
  11. UDP数据包大小设定
  12. 【精读AI论文】inceptionV2 BN-inception Batch Normalization BN 批量标准化
  13. ❤ ❤响应式小米官网源码!!!(js+css+html)❤ ❤
  14. U盘写保护修复(亲测可用)
  15. css字的大小,css 中字体大小
  16. “远程网络教学系统”UML用例图(练习题)
  17. oracle创建一个永久性表空间,oracle创建表空间
  18. 5.Fabric v2.0 java-sdk 根据TXID查询区块并从区块解析数据
  19. android数据球图,Android OpenGL球体贴图
  20. 神经网络种类及应用领域,常用的神经网络有哪些

热门文章

  1. 怎么能让宝贝快点入睡?
  2. 如何保持婚姻的新鲜感?
  3. 丁克是什么意思,丁克家庭是什么意思,丁克家庭为什么越来越多
  4. 房贷提前还款怎么还?
  5. 互联网思维借鉴的两个核心
  6. 适合上班族的两种兼职
  7. 有哪些产品被阿里巴巴收购导致质量下滑?
  8. sql 一次性批量插入_考虑使用SQL批量插入的安全性
  9. sql server 分区_使用分区归档SQL Server数据
  10. 微软power bi_Microsoft Power Platform快速概述