关键词:
【中文标题】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) end
和for i,v in ipairs([2]='a', [3]='b', [4]='d') do print(i,v) end
【参考方案2】:
Lua 中没有 array
-type,只有 table
s 可能有从索引 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
和起点nil
。
next
接受表和索引,如果存在,则返回下一个索引和关联值。
因此,所有元素都以任意顺序显示。
这个功能的创意是没有限制的,这正是原版 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和... 查看详情