Lua 中 pairs() 和 ipairs() 的区别是什么?
2019-3-11 20:20:29
收藏:0
阅读:432
评论:2
点赞
用户10808674
ipairs() 和pairs() 有一些不同,可以在 手册参考 中看到。一个较非技术性的描述可能是:
ipairs()返回索引-值对,主要用于数字表。非数字键被整个忽略,类似于小于1的数字索引。此外,在索引之间存在间隔会导致停止。排序是确定的,通过数值大小。pairs()返回键-值对,主要用于关联表。所有键都被保留,但顺序是不确定的。
此外,虽然pairs() 可用于获取表的大小(见此其他问题),但对于同一任务将ipairs() 用于不保险,因为它可能会漏掉一些键。
下面的代码片段说明了两个选项之间的差异。
> u = {}
> u[-1] = "y"
> u[0] = "z"
> u[1] = "a"
> u[3] = "b"
> u[2] = "c"
> u[4] = "d"
> u[6] = "e"
> 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
2 c
3 b
4 d
6 e
0 z
hello world
-1 y
>
正如我们在例子中看到的,虽然所有键都出现在pairs()的输出中,但ipairs()中缺少一些键:
hello因为它不是数字键;
-1和0,因为尽管它们是数字,但它们的值小于1,以及;
6,因为我们隐式有u[5] = nil,在迭代时找到nil值恰好是ipairs()的结束条件。
最后,注意,就像在您的示例中一样,当您创建一个未指定任何键的表时,例如 a = {“one”,“two”,“three”},会将从1开始的数字键隐式分配给每个值,即定义被理解为 a = { [1] = "one", [2] = "two", [3] = "three" }。因此,在这些情况下使用pairs()或ipairs()基本相同,除了pairs()不保证排序。
2019-03-11 19:55:16
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

在 Lua 中没有
array类型,只有table可以从索引 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 的期望。
请参见 "Lua 中的 Bizzare“尝试调用表值”",其中有一个用户编写的可调用的示例,以及某些方言如果第一个值实际上不是可调用的情况下如何反应。