先看一段简单的代码:

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

输出结果:

for --- index

for ---- index-value

for ---- key-value

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 = {
[] = "b",
[] = "c"
}
for i,v in ipairs(mytable2) do
print(i,v)
end

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

所以:

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

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

Lua-泛型for循环 pairs和ipairs的区别的更多相关文章

  1. Lua中 pairs和ipairs的区别

    Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...

  2. pairs 和 ipairs 的区别

    ipairs 在迭代过程中是会直接跳过所有手动设定key值的变量.pairs不会跳过手动设置key值的变量. 实例 tab = {,,a="cd","d"} f ...

  3. lua中pairs和ipairs的区别

    标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...

  4. Lua 中 pairs 和 ipairs 的区别

    ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction ...

  5. lua中pairs 和 ipairs 的区别

    1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...

  6. lua 中pairs 和 ipairs区别

    lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...

  7. lua中for循环的四种遍历方式

    lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3   key,value pairs 取每一 ...

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

    为了看出两者的区别,首先定义一个table: a={"Hello","World";a=1,b=2,z=3,x=10,y=20;"Good" ...

  9. Lua 中pairs与ipairs区别

    local tmp_tab = {}; tmp_tab[]="lua"; tmp_tab[]="hello" tmp_tab[]="aaa" ...

随机推荐

  1. Struts2--ONGL--值栈

    ONGL:用来访问栈里对象属性的语言,通常由Struts标签来解析, 注意:要在接续OGNL的页面加入<%@ taglib prefix="s" uri="/str ...

  2. 蓝牙4.0 BLE基础之vdd检测new

    外部ADC通道,我们现在用的是A0脚,也就是P00通道 把它设置成输出的一个模式.在程序中设置,代码如下: #include <ioCC2540.h> #define HAL_ADC_RE ...

  3. Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)

    1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio P ...

  4. Javaweb -- ServletContextListener

    当启动web应用后端服务时,有时需要预先从数据库或者配置文件等读取信息来配置一些全局变量之类的 这时可以用ServletContextListener,在启动服务时,加载设置基本配置 实现如下: (1 ...

  5. [译]对 AngularJS 模板的A/B测试

    编者按:本文翻译自 Andrei Bondarev 在 Medium 上发布的"A/B Testing your AngularJS Templates ",Andrei 是一名工 ...

  6. 希望有兴趣的加入,共同为项目智能化管理jar包而努力 第二篇

      想听听大家对于我这个想法的一些看法,喷也好,赞也罢,希望留下您宝贵的建议!   有共同想法并且想实现的请入群 2500261120   在使用autort插件时,首先要到autort服务器下载所有 ...

  7. Mac删除JDK

    安装了1.6以后,没有安装1.7发现Android Studio报错: invalid source release: JDK 1.7 原因是Android Studio需要1.7以上的版本,结果再次 ...

  8. CSS魔法堂:不得不说的Containing Block

    前言  <CSS魔法堂:重新认识Box Model.IFC.BFC和Collapsing margins>中提到在没有floated兄弟盒子时,line box的左右边框会与所属的cont ...

  9. 这些HTML、CSS知识点,面试和平时开发都需要 No5-No7

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

  10. 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境

    前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有 ...