首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Lua中pairs()和ipairs()有什么不同?

在Lua中pairs()和ipairs()有什么不同?
EN

Stack Overflow用户
提问于 2019-03-12 03:12:13
回答 2查看 61.6K关注 0票数 71

在for循环中,使用pairs()和ipairs()进行循环有什么区别?此页面同时使用了两种方法:Lua Docs

使用ipairs():

代码语言:javascript
运行
复制
a = {"one", "two", "three"}
for i, v in ipairs(a) do
  print(i, v)
end

结果:

代码语言:javascript
运行
复制
1   one
2   two
3   three

使用pairs():

代码语言:javascript
运行
复制
a = {"one", "two", "three"}
for i, v in pairs(a) do
  print(i, v)
end

结果:

代码语言:javascript
运行
复制
1   one
2   two
3   three

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 03:55:17

pairs()ipairs()略有不同。

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

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

代码语言:javascript
运行
复制
> 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
> 

当您创建一个没有键的表时(如您的问题所示),它的行为就像一个数字数组,行为或对和i对是相同的。

代码语言:javascript
运行
复制
a = {"one", "two", "three"}

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

票数 105
EN

Stack Overflow用户

发布于 2019-03-12 03:47:40

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

与数字for循环不同,通用for循环需要三个值:

  1. A callable
  2. 它在
  3. 上传递的上下文值初始索引值

它使用context-value和index-value调用callable,将所有返回值存储在提供的新变量中。第一个被附加地保存为新的索引值。

下面是循环的一些典型的可调用示例:

  1. ipairs(t)返回一个函数、表t和起始点0

该函数在道德上等同于:

函数ipairs_next(t,i) i=i+1var v= ti如果v ~= nil,则返回i,v end end

因此,从1开始直到第一个缺失的所有数值条目都被shown.

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

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

  • 对于函数的创造性是没有限制的,这就是vanilla Lua所期望的。

有关用户编写的callable的示例,以及如果第一个值实际上不是callable时某些方言的反应,请参见"“。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55108794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档