Lua中pair和ipair的区别
Lua中pair和ipair的区别?
二者都是Lua中内置的迭代器,可以对数组或table进行遍历。
在正常的数组或table的遍历中,二者没有区别。
tableNormal={"this","is","a","array"}
--使用 pairs 遍历
for key,val in pairs(tableNormal) do
print(key,'==',val)
end
遍历结果:

--使用 ipairs遍历
for key,val in ipairs(tableNormal) do
print(key,'==',val)
end
遍历结果:

二者没有任何差别!
之所以说是正常的数组,是因为索引是连续的,数值都是存在的,不存在nil的情况。
而如果索引不连续,或索引类型不是num,那么二者就显现出差别。再看,
- 索引类型为num,但不连续
table1={}
table1[1]="Hello"
table1[2]="Tony!"
table1[3]="This"
table1[6]="is"
--使用ipairs 遍历
for key,val in ipairs(table1) do
print(key,'==',val)
end
结果:

--使用pairs遍历
for key,val in pairs(table1) do
print(key,'==',val)
end
结果:

显然,使用pairs能对数组内容整体遍历。而ipairs只会访问连续的数字索引内容。
查看一下table长度(实际长度为4):
print("table1的长度",#table1)

好,我们再看一个情况:
table2={[2]="welcome",[3]="to",[4]="my",[5]="blog"}
print("----------------ipairs-------------------------")
for key,val in ipairs(table2) do
print(key,"==",val)
end
猜猜会打印什么?
什么也没有打印!可见ipairs只能从索引为1的位置遍历,且只能访问连续的索引区间。

当然,pairs可以直接遍历咯!
for key,val in pairs(table2) do
print(key,"==",val)
end

--查看数组长度
print("table2长度====",#table2)

可见长度的获取和ipairs有关。
我们可以自定义获取数组长度的函数
function tableSize(table)
local size=0
for k,v in pairs(table) do
size=size+1
end
return size
end
print("table2长度====",tableSize(table2))

对于索引类型为非nums的table来说,若想遍历直接使用pairs即可。
tableAbnormal={[1]="TonyCode",index1="index1",i2="index2",s3="s3"}
print("=============ipairs的执行结果=============")
for i, v in ipairs(tableAbnormal) do
print(i, '=', v)
end
print("=============pairs的执行结果=============")
for i, v in pairs(tableAbnormal) do
print(i, '=', v)
end


综上可知,ipairs适用于数值索引且连续的数组或table的遍历,而pairs对于不同元素类型的数组都适用。但是能使用ipairs尽可能使用,其性能更好。
Lua中pair和ipair的区别的更多相关文章
- 范性for语义以及pair和ipair的区别
详情参考 lua手册 1. 范性for语义 在了解pair和ipair前先简单了解下lua中的for循环,这里只阐述范性for循环的语义,范性 for 在自己内部保存迭代函数,实际上它保存三个值:迭代 ...
- Lua中 pairs和ipairs的区别
Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...
- Lua table pair和ipair区别
官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...
- lua中pairs和ipairs的区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...
- Lua中ipairs和pairs的区别详解
迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...
- Lua 中 pairs 和 ipairs 的区别
ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction ...
- lua中pairs 和 ipairs 的区别
1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...
- lua 中pairs 和 ipairs区别
lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...
- Lua中“.”调用方法与“:”调用方法的区别
Lua中“.”调用方法与“:”调用方法的区别: ...
- lua 中 . 和 : 的区别
lua 中 . 和 : 的区别 首先在lua中使用":"定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而&qu ...
随机推荐
- C# 中判断List集合是否为空
判断List集合是否为空,可以使用Count和Any,下面是其使用场景(别人总结)
- 设计模式学习-使用go实现备忘录模式
备忘录模式 定义 优点 缺点 适用范围 代码实现 参考 备忘录模式 定义 备忘录( Memento ):在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之处保存该状态.这样以后就可将该对象恢 ...
- C/C++ 搜索缝隙并插入ShellCode
将ShellCode放入变量中,然后修改插入可执行文件名称,运行后即可将shellCode插入到EXE中,并设置好装载地址,程序运行后会先上线,然后在执行原始的代码,在使用metaspoit生成she ...
- ABC270F 题解
和博客园一样好的体验 思路 首先看到花最小代价使得所有点连通,果断转换成最小生成树问题. 接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权.因为一个点飞或者 ...
- npm i -D和-s及-g以及--save的那些事
i 是 install 的简写 -S 就是 --save 的简写 -D 就是 --save-dev 的简写 npm i module_name -S = > npm install modu ...
- List大陷阱,这个问题,造成我的很多问题,我靠,今天才发现MyList.Duplicates := dupIgnore;不sort就无效。
procedure TfrmMain.Button1Click(Sender: TObject); var MyLogisticsCompanyApi: TLogisticsCompanyApi; b ...
- Zookeeper-ZKFC的原理和功能
一.前言 HADOOP2 HA架构引入了ZKFC.Journalnode组件,本篇文章主要介绍ZKFC的功能和原理.HA架构支持两种切换方式: 手动切换: 通过命令实现主备之间的切换,可以用HDFS ...
- NC14291 Cut
题目链接 题目 题目描述 给你一个长度为 \(n\) 的序列,你每次可以将一个序列分割成两个连续的的子序列, 分割的代价为原序列的总和. 现在允许你在初始时将序列重新排列一次. 问分割成 \(n\) ...
- NC24263 USACO 2018 Feb G]Directory Traversal
题目链接 题目 题目描述 奶牛Bessie令人惊讶地精通计算机.她在牛棚的电脑里用一组文件夹储存了她所有珍贵的文件,比如: bessie/ folder1/ file1 folder2/ file2 ...
- postgresql常见开发技巧
1.数据类型 名字 描述 bigint 有符号 8 字节整数 bigserial 自增八字节整数 bit [ (n) ] 定长位串 bit varying [ (n) ] 变长位串 boolean 逻 ...