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,那么二者就显现出差别。再看,

  1. 索引类型为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))

  1. 对于索引类型为非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尽可能使用,其性能更好。

    参考文章:https://zhuanlan.zhihu.com/p/85890198

Lua中pair和ipair的区别的更多相关文章

  1. 范性for语义以及pair和ipair的区别

    详情参考 lua手册 1. 范性for语义 在了解pair和ipair前先简单了解下lua中的for循环,这里只阐述范性for循环的语义,范性 for 在自己内部保存迭代函数,实际上它保存三个值:迭代 ...

  2. Lua中 pairs和ipairs的区别

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

  3. Lua table pair和ipair区别

    官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...

  4. lua中pairs和ipairs的区别

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

  5. Lua中ipairs和pairs的区别详解

    迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...

  6. Lua 中 pairs 和 ipairs 的区别

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

  7. lua中pairs 和 ipairs 的区别

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

  8. lua 中pairs 和 ipairs区别

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

  9. Lua中“.”调用方法与“:”调用方法的区别

    Lua中“.”调用方法与“:”调用方法的区别:                                                                             ...

  10. lua 中 . 和 : 的区别

    lua 中 . 和 : 的区别 首先在lua中使用":"定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而&qu ...

随机推荐

  1. C# 中判断List集合是否为空

    判断List集合是否为空,可以使用Count和Any,下面是其使用场景(别人总结)

  2. 设计模式学习-使用go实现备忘录模式

    备忘录模式 定义 优点 缺点 适用范围 代码实现 参考 备忘录模式 定义 备忘录( Memento ):在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之处保存该状态.这样以后就可将该对象恢 ...

  3. C/C++ 搜索缝隙并插入ShellCode

    将ShellCode放入变量中,然后修改插入可执行文件名称,运行后即可将shellCode插入到EXE中,并设置好装载地址,程序运行后会先上线,然后在执行原始的代码,在使用metaspoit生成she ...

  4. ABC270F 题解

    和博客园一样好的体验 思路 首先看到花最小代价使得所有点连通,果断转换成最小生成树问题. 接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权.因为一个点飞或者 ...

  5. npm i -D和-s及-g以及--save的那些事

      i 是 install 的简写 -S 就是 --save 的简写 -D 就是 --save-dev 的简写 npm i module_name -S = > npm install modu ...

  6. List大陷阱,这个问题,造成我的很多问题,我靠,今天才发现MyList.Duplicates := dupIgnore;不sort就无效。

    procedure TfrmMain.Button1Click(Sender: TObject); var MyLogisticsCompanyApi: TLogisticsCompanyApi; b ...

  7. Zookeeper-ZKFC的原理和功能

    一.前言 HADOOP2 HA架构引入了ZKFC.Journalnode组件,本篇文章主要介绍ZKFC的功能和原理.HA架构支持两种切换方式: 手动切换:  通过命令实现主备之间的切换,可以用HDFS ...

  8. NC14291 Cut

    题目链接 题目 题目描述 给你一个长度为 \(n\) 的序列,你每次可以将一个序列分割成两个连续的的子序列, 分割的代价为原序列的总和. 现在允许你在初始时将序列重新排列一次. 问分割成 \(n\) ...

  9. NC24263 USACO 2018 Feb G]Directory Traversal

    题目链接 题目 题目描述 奶牛Bessie令人惊讶地精通计算机.她在牛棚的电脑里用一组文件夹储存了她所有珍贵的文件,比如: bessie/ folder1/ file1 folder2/ file2 ...

  10. postgresql常见开发技巧

    1.数据类型 名字 描述 bigint 有符号 8 字节整数 bigserial 自增八字节整数 bit [ (n) ] 定长位串 bit varying [ (n) ] 变长位串 boolean 逻 ...