Lua中pair和ipair的区别

这篇具有很好参考价值的文章主要介绍了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

遍历结果:

Lua中pair和ipair的区别

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

遍历结果:

Lua中pair和ipair的区别

二者没有任何差别!

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

结果:

Lua中pair和ipair的区别

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

结果:

Lua中pair和ipair的区别

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

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

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

Lua中pair和ipair的区别

好,我们再看一个情况:

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

猜猜会打印什么?

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

Lua中pair和ipair的区别

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

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

Lua中pair和ipair的区别

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

Lua中pair和ipair的区别

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

Lua中pair和ipair的区别

  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
    

    Lua中pair和ipair的区别

    Lua中pair和ipair的区别

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

    参考文章:https://zhuanlan.zhihu.com/p/85890198文章来源地址https://www.toymoban.com/news/detail-837731.html

到了这里,关于Lua中pair和ipair的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity脚本API中OnCollisionEnter()、OnTriggerEnter()二者的区别

    Unity中的 OnCollisionEnter 和 OnTriggerEnter 两个函数在日常的开发中很常见但也容易混淆,下面说一说两者的区别。 碰撞器(Collider)和触发器(Trigger)都是Unity中用于检测物体之间交互的组件。它们的主要区别在于对物体之间交互的处理方式。 碰撞器(Collider) 用于检测两个物体

    2024年02月01日
    浏览(21)
  • 静态HTTP和动态HTTP的区别:理解二者的优势和局限

    在互联网的世界里,HTTP(Hypertext Transfer Protocol)是当之无愧的“交通规则”。它负责在浏览器和服务器之间传输数据,让你可以在网页上浏览、互动和下载内容。根据动态和静态的不同,HTTP网站可以分为静态HTTP网站和动态HTTP网站。这两种类型网站都有其特定的优势和局限。

    2024年02月04日
    浏览(24)
  • 计算机网络-奈氏准则和香农定理(码间串扰 二者区别)

    就是指与原来的不一样了 两种情况 前三个是正相关,最后一个是负相关 码元传输速率越快,失真程度越严重的原因可能包括以下几点: 信号的频率成分增加:随着码元传输速率的提高,信号的频率成分也会相应增加。高频信号更容易受到电路特性的影响,如电阻、电容和电

    2024年01月25日
    浏览(36)
  • 无涯教程-Lua - Iterators(迭代器)

    迭代器是一种构造,使您可以遍历所谓的集合或集合的元素。在Lua中,这些集合通常引用表,这些表用于创建各种数据结构(如数组)。 通用的 for 迭代器提供集合中每个元素的键值对。下面给出一个简单的示例。 当无涯教程运行上面的代码时,将获得以下输出- 上面的示例使

    2024年02月14日
    浏览(26)
  • 如何创建和查看软链接和硬链接?这二者的区别是什么?

    hello大家好😊 在linux中,文件链接可以使多个文件名引用同一个文件。有两种方式可以创建指向同一个文件的多个名称,分别是 硬链接和软链接(符号链接) 在介绍软链接和硬链接前,我们先看下什么是 inode 。👇 索引节点是 Linux 文件系统中的秘密工作者,它们存储文件或

    2024年02月12日
    浏览(29)
  • Lua gc 机制版本迭代过程简述

    内存自动化管理是指在指定内存不再被需要时可以自动被释放。通常有两种方案来实现内存的自动化管理: 引用计数 (reference count) 垃圾回收 (garbage collection) Lua 选择的是垃圾回收的方案。不选择引用计数的方式的主要原因是,在动态类型语言中,使用引用计数来管理内

    2024年02月16日
    浏览(21)
  • 【数据结构】二叉查找树和平衡二叉树,以及二者的区别

    目录 1、二叉查找树 1.1、定义  1.2、查找二叉树的优点  1.2、查找二叉树的弊端 2、平衡二叉树 2.1、定义 2.2、 实现树结构平衡的方法(旋转机制) 2.2.1、左旋 2.2.2、右旋 3、总结        二叉查找树又名二叉排序树,亦称二叉搜索树。是每个结点最多有两个子树的树结构

    2024年02月20日
    浏览(34)
  • Git常见问题:git pull 和 git pull --rebase二者区别

    git pull 和 git pull --rebase 都是从远程仓库获取最新的更改并将其合并到本地分支。但它们之间的区别在于合并方式。以下是它们之间的主要区别: git pull: 当你执行 git pull 时,Git 会执行以下两个操作: git fetch:从远程仓库获取最新的更改,将其存储在一个临时的分支上(通

    2024年02月09日
    浏览(34)
  • Lua学习笔记之迭代器、table、模块和包、元表和协程

    迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素。 泛型for自己内部保存迭代函数,实际上保存三个值:迭代函数、状态常量、控制变量。

    2024年03月09日
    浏览(45)
  • MyBatis-plus中的两种快捷操作数据库方式:1、mapper调用 2、ActiveRecord方式(简称AR) 二者的使用和区别介绍

            在使用MyBatis操作数据库时,需要频繁的写mapper层dao接口以及对应的配置文件和SQL语句,当功能方法繁杂,业务逻辑不复杂的时候,我们可以使用MyBatis的升级版MyBatis-Plus来代替我们写这些繁琐的配置文件和简单的SQL。 (1)书写或使用MP生成数据库表对应的实体类。

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包