Lua中pairs()和ipairs()的区别是啥?

     2023-03-28     92

关键词:

【中文标题】Lua中pairs()和ipairs()的区别是啥?【英文标题】:What is the difference of pairs() vs. ipairs() in Lua?Lua中pairs()和ipairs()的区别是什么? 【发布时间】:2019-08-02 04:14:17 【问题描述】:

在for循环中,使用pairs()和ipairs()循环有什么区别?此页面同时使用:Lua Docs

使用 ipairs():

a = "one", "two", "three"
for i, v in ipairs(a) do
  print(i, v)
end

结果:

1   one
2   two
3   three

使用pairs():

a = "one", "two", "three"
for i, v in pairs(a) do
  print(i, v)
end

结果:

1   one
2   two
3   three

你可以在这里测试它:Lua Demo

【问题讨论】:

【参考方案1】:

pairs()ipairs() 略有不同。

pairs() 返回键值对,主要用于关联表。密钥顺序未指定。 ipairs() 返回索引值对,主要用于数值表。数组中的非数字键被忽略,而索引顺序是确定性的(按数字顺序)。

下面的代码片段说明了这一点。

> u=
> u[1]="a"
> u[3]="b"
> u[2]="c"
> u[4]="d"
> u["hello"]="world"
> for key,value in ipairs(u) do print(key,value) end
1   a
2   c
3   b
4   d
> for key,value in pairs(u) do print(key,value) end
1   a
hello   world
3   b
2   c
4   d
> 

当您创建没有键的表时(如您的问题所示),它的行为类似于数字数组,行为或对和 ipairs 是相同的。

a = "one", "two", "three"

相当于a[1]="one"a[2]="two"a[3]="three"pairs()ipairs() 将是相同的(除了在pairs() 中不保证的顺序)。

【讨论】:

我相信pairs()可以保证排序,它会通过数字索引,然后会以随机顺序进入其他非数字值。 @BeastCoder2:在lua.org/manual/5.3/manual.html#pdf-next,它表示“未指定枚举索引的顺序,即使是数字索引。”您所描述的可能是 Lua 中的常见行为,但它可能会在任何错误修复版本中发生变化。 @luther 谢谢你的澄清!它可能只是我用来运行代码的东西。 我还看到 pairs 按顺序迭代从 1 开始的连续整数索引(有时是非连续整数索引),但不能保证。 关于ipairs 的另一个重要点是它只循环索引的第一个序列,从1 开始:它在第一个间隙处停止。考虑for i,v in ipairs([1]='a', [2]='b', [4]='d') do print(i,v) endfor i,v in ipairs([2]='a', [3]='b', [4]='d') do print(i,v) end【参考方案2】:

Lua 中没有 array-type,只有 tables 可能有从索引 1 开始的连续元素。

与数字 for 循环相比,通用 for 循环需要三个值:

    一个可调用对象 它传递的上下文值 初始索引值

它使用上下文值和索引值调用可调用对象,将所有返回值存储在提供的新变量中。第一个额外保存为新的索引值。

现在循环调用的一些代表性示例:

    ipairs(t) 返回一个函数,表格t,起点0。 该功能在道德上等同于:

    function ipairs_next(t, i)
        i = i + 1
        var v = t[i]
        if v ~= nil then
            return i, v
        end
    end
    

    因此,会显示从 1 开始直到第一个缺失的所有数字条目。

    pairs(t) 或者委托给t 的元表,特别是__pairs(t),或者返回函数next、表t 和起点nilnext 接受表和索引,如果存在,则返回下一个索引和关联值。

    因此,所有元素都以任意顺序显示。

    这个功能的创意是没有限制的,这正是原版 Lua 所期望的。 请参阅“Bizzare "attempt to call a table value" in Lua”了解用户编写的可调用对象的示例,以及如果第一个值实际上不是可调用对象,某些方言会如何反应。

【讨论】:

我是这门语言的新手,想知道每个是什么,每种类型的 for 循环是什么?什么是可调用的、上下文值和索引值? ipairs_next 是什么,你做的一个函数? 我也是 lua 新手,但我认为它是一个迭代器函数,查找“编程中的迭代器”

lua中,泛型for循环遍历table时,ipairs和pairs的区别(代码片段)

...个table: a="Hello","World";a=1,b=2,z=3,x=10,y=20;"Good","Bye"使用ipairs对其进行遍历: fori,vinipairs(a)doprint(v)end输出的结果是:HelloWorldGoodBye可见ipairs并不会输出table中存储的键值对,会跳过键值对,然后按顺序输出tab 查看详情

lua中ipairs和pairs的区别详解(代码片段)

迭代器for遍历table时,ipairs和pairs的区别:区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去区别二:locala="Hello","World",a=1,b=2,x=10,y=20,"Good",nil,"Bye"--fori,vinipairs(a)do--print(v)--endfork,vinpairs(a)doprint(k,v)end可见:ipairs并不会输出ta... 查看详情

pairs和ipairs的区别(代码片段)

在lua中ipairs和pairs均可以用来遍历集合,但是两者有区别;同:都是能遍历集合(表、数组),两者均优先按顺序输出没有key的值;异:对于有key的集合:ipairs从第一个数字key开始,依次输... 查看详情

ipairs与pairs的区别

ipairs和pairs在lua中都是遍历tbale的函数可是两者有差别 1.pairs遍历table中的全部的key-vale而ipairs会依据key的数值从1開始加1递增遍历相应的table[i]值如:table1=key1="val1",key2="val2","val3"pairs会优先输出没有键的值,即先输出"val3",再... 查看详情

lua特性

...数据类型:nil,boolean,number,string,userdata,function,table;5.pairs和ipairs区别:pairs:迭代table,遍历表中所有的KEY,可以返回nil;ipairs:迭代数 查看详情

lua中易混淆函数

lua中易混淆的函数ipairs和pairs:ipairs只能顺序遍历table,遇到key不是数字就会退出pairs可以遍历table中所有元素---------------------------------------------------------------------pcall和xpcallpcall格式:pcall(function,...)运行函数返回true或false,不能 查看详情

pairs和ipairs异同(代码片段)

 同:都是能遍历集合(表、数组)异:ipairs仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到集合中出现的第一个不是整数的key。pairs能遍历集合的所有... 查看详情

lua教程

...a中的表达式Lua中的语句Lua中的函数Lua中的闭包Lua中pairs和ipairs的区别Lua中的迭代器与泛型forLua中的协同程序Lua中__index和__newindex实践Lua中的元表与元方法Lua中的环境概念Lua中的模块与包Lua中的面向对象编程Lua中的一些库(1)Lua中... 查看详情

第9月第26天pairs和ipairs

1.a={ip="127.0.0.1",port=6789}fori,vinpairs(a)doprint(i,v)end a={1}fori,vinipairs(a)doprint(i,v)endhttp://blog.csdn.net/witch_soya/article/details/7556595 查看详情

lua语言中是不是可以在table中存储函数

...for i,v in pairs(a) do    -- ipairs 和 pairs 的区别在于index是否为连续整数    print(v)end参考技术A可以用数字下标放但我们更常用的方法是以字符串做下标lo 查看详情

lualua中ipair和pair的区别

pairs会遍历table的所有键值对。而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历。顺便说下,记忆也很简单,带i的就是根据integerkey值从1开始遍历的。请看个例子。tb={"oh",[3]="god","my",[... 查看详情

lua笔记——4.环境environment(代码片段)

...Lua在全局环境_G中添加了标准库比如math、函数比如pairs、ipairs等,可以使用以下代码打印当前环境中所有全局变量的名称:forninpairs(_G)doprint(n)en 查看详情

lua中.和:的区别(代码片段)

lua中.和:的区别首先在lua中使用“:”定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而“.”定义的函数中没有self。functionclass:func2()endfunctionclass.f... 查看详情

lua是啥语言

参考技术ALua是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它的主页是www.lua.org。Lua最著名的应用是在暴雪公司的网络游戏WOW中。Lua脚本可以很容... 查看详情

OpenGL中Framebuffer和Renderbuffer的概念和区别是啥?

】OpenGL中Framebuffer和Renderbuffer的概念和区别是啥?【英文标题】:What\'stheconceptofanddifferencesbetweenFramebufferandRenderbufferinOpenGL?OpenGL中Framebuffer和Renderbuffer的概念和区别是什么?【发布时间】:2011-01-1320:34:21【问题描述】:我对Framebuf... 查看详情

lua调用失败是啥意思

参考技术ALua中使用locala=require"xxx"的方式加载自己用C实现的DLL,DLL中有导出函数luaopen_xxx。调试过程中发现,luaopen_xxx传入的L是有值的,但是使用lua_gettop拿到的是-1,其他的操作都会出现崩溃。一番调试和查阅文档后发现... 查看详情

程序开发中遇到的lua语言概念是啥呢?

程序开发中遇到的lua语言概念是什么呢?参考技术ALua教程luaLua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua是巴西里约... 查看详情

ajax中类型和方法的区别是啥

】ajax中类型和方法的区别是啥【英文标题】:WhatistheDiffbetweentypeandmethodinajaxajax中类型和方法的区别是什么【发布时间】:2017-09-1811:36:35【问题描述】:您好,根据我的经验,我已经使用了这两种东西我在想方法和类型都是POST和... 查看详情