首页 > 其他分享 >Lua中pair和ipair的区别

Lua中pair和ipair的区别

时间:2024-03-08 20:44:06浏览次数:19  
标签:pairs 遍历 val print ipair ipairs Lua key pair

Lua中pair和ipair的区别?

二者都是Lua中内置的迭代器,可以对数组或table进行遍历。

在正常的数组或table的遍历中,二者没有区别。

tableNormal={"this","is","a","array"}
--使用 pairs 遍历
for key,val in pairs(tableNormal) do
    print(key,'==',val)
end

遍历结果:

image-20240308194558419

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

遍历结果:

image-20240308194625680

二者没有任何差别!

之所以说是正常的数组,是因为索引是连续的,数值都是存在的,不存在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

结果:

image-20240308200218112

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

结果:

image-20240308200300457

显然,使用pairs能对数组内容整体遍历。而ipairs只会访问连续的数字索引内容。

查看一下table长度(实际长度为4):

print("table1的长度",#table1)

image-20240308203310667

好,我们再看一个情况:

table2={[2]="welcome",[3]="to",[4]="my",[5]="blog"}
print("----------------ipairs-------------------------")
for key,val in ipairs(table2) do
    print(key,"==",val)
end

猜猜会打印什么?

什么也没有打印!可见ipairs只能从索引为1的位置遍历,且只能访问连续的索引区间。

image-20240308201107204

当然,pairs可以直接遍历咯!

for key,val in pairs(table2) do
    print(key,"==",val)
end

image-20240308201355047

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

image-20240308202315426

可见长度的获取和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))

image-20240308202717573

  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
    

    image-20240308201916520

    image-20240308201852055

    综上可知,ipairs适用于数值索引且连续的数组或table的遍历,而pairs对于不同元素类型的数组都适用。但是能使用ipairs尽可能使用,其性能更好。

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

标签:pairs,遍历,val,print,ipair,ipairs,Lua,key,pair
From: https://www.cnblogs.com/TonyCode/p/18061820

相关文章

  • xlua - 增加protobuf库
    lua下常用的2个protobuf库1) GitHub-starwing/lua-protobuf:ALuamoduletoworkwithGoogleprotobuf2) GitHub-cloudwu/pbc:AprotocolbufferslibraryforC这边使用第1个库 a)下载lua-protobuf源码,并解压到xlua的build文件夹根目录 b)CMakeLists.txt中......
  • lua模块化编程
    moduleA.lua--moduleA.lualocalmoduleA={}functionmoduleA.hello()print("HellofrommoduleA")--与调用者同一个环境,可以调用到原环境中的sayHi函数sayHi()endreturnmoduleAmoduleB.lua--moduleB.lualocalmoduleB={}functionmoduleB.......
  • 自已写的shell小程序: 查询删除lua+redis和conf配置的nginx黑名单
    #!/bin/bash#定义一些变量REDIS_HOST=192.168.10.38REDIS_PORT=6370REDIS_AUTH=123456NGINX_BLOCKIPCONF_PATH=/data/software/openresty/nginx/conf.d/block_ip.conf#接收需要查询的IP地址echo-e"查询被www.baiinfo.com屏蔽的IP地址,请输入精确的IP地址(支......
  • Java编程的利器:Pair和Triple无缝解决多值返回问题,助力编写高效代码
    在实际编码中,经常会遇到一个方法需要返回多个值的情况,你编写一个方法,需要同时返回某个操作的结果和一些相关的附加信息。使用传统的方式,你可能需要创建一个包含这些信息的自定义类或者使用集合(如Map)来存储这些值。然而,这往往使得代码变得臃肿,而且对于调用方来说,理解和提取这些值......
  • xlua - 增加lua-cjson库
    xlua貌似不支持单独动态加载cjson.dll,试了各种方式,都是会造成Unity闪退,也不知道原因。解决办法就是直接编译进xlua.dll 1)下载lua-cjson源码,并解压到xlua的build文件夹根目录GitHub-openresty/lua-cjson:LuaCJSONisafastJSONencoding/parsingmoduleforLua 2......
  • lua5.1 - function env
    注意:只在lua5.1才支持,后面的lua版本做了改动不再兼容 myEnv.lualocalmyEnv={}myEnv.a=1myEnv.b="one"myEnv.log=printreturnmyEnv Test.lualocalmyEnv=require("myEnv")setfenv(1,myEnv)--调用上面的函数后,print将没法使用因为那是在全局env......
  • pair
    pair的定义和结构模板类一对值的组合头文件<utility>两个模板参数,T1和T2,分别表示第一个值和第二个值的类型两个成员变量,first和second,分别表示第一个值和第二个值有一些成员函数和特性默认构造函数带参数的构造函数比较运算符重载可以将两个值组合在一起进行......
  • [ABC217F] Make Pair 题解
    [ABC217F]MakePair题解思路解析通过\(n\le200\)和“选出的两个学生离开队列,空出来的位置左右合拢”这两个细节可以想到能用区间dp做,\(f_{i,j}\)表示将\(i\toj\)这个区间全部选完的方案数,然后常规区间dp,加一个判断如果当前区间\([l,r]\)中\(l,r\)是朋友,就可......
  • Lua学习笔记3
    Lua学习笔记3IO读写Lua中读写使用自带的I/O库处理文件。分为简单模式和完全模式。简单模式(simplemodel)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(completemodel)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件......
  • lua协程 - 把回调模式的代码流程改成顺序执行流程
    像ugui的点击按钮,然后触发相关逻辑,都是回调模式的写法,比如下面代码的ShowAlert调用publicclassTest7:MonoBehaviour{publicGameObjectm_Alert;publicTextm_TxtMsg;publicButtonm_BtnYes;publicButtonm_BtnNo;privateLuaEnvm_LuaEnv;......