Lua中pairs()和ipairs()有什么区别?

2024-02-17

In a for循环,循环与循环有什么区别pairs() versus ipairs()?

Lua 编程book https://www.lua.org/pil/4.3.5.html提到了两者,但是两者似乎都会生成类似的输出,如下所示:

Using ipairs():

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

Output:

1   one
2   two
3   three

Using pairs():

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

Output:

1   one
2   two
3   three

ipairs() and pairs()略有不同,正如您在手册参考 https://www.lua.org/manual/5.4/manual.html。 一个不太技术性的描述可能是:

  • ipairs()返回索引值对,主要用于数字表。 非数字键将被整体忽略,类似于小于 1 的数字索引。 此外,指数之间的差距也会导致停牌。 排序是按数值大小确定的。

  • pairs()返回键值对,主要用于关联表。 所有密钥均被保留,但顺序未指定。

此外,同时pairs()可用于获取表的大小(请参阅这另一个问题 https://stackoverflow.com/questions/2705793/how-to-get-number-of-entries-in-a-lua-table), 使用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 and 0因为,尽管它们是数字,但它们的值小于 1,并且;6鉴于我们隐含地有u[5] = nil,并且在迭代时找到 nil 值正是 的结束条件ipairs().

最后,请注意,如您的示例所示,当您创建表而不指定任何键时,例如,a = {"one", "two", "three"},从 1 开始的数字键隐式分配给每个值,即定义被理解为a = { [1] = "one", [2] = "two", [3] = "three" }。 因此,使用pairs() or ipairs()在这些场景中基本上是相同的,除了非保证排序pairs().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua中pairs()和ipairs()有什么区别? 的相关文章

  • Lua 中的内联条件(a == b ? "yes" : "no")?

    无论如何 Lua 中可以使用内联条件吗 Such as print blah a true blah nahblah Sure print blah a and blah or nahblah
  • 使用 corona sdk 验证电子邮件地址

    在我的项目中 有一个供用户填写详细信息的表单 其中有一个文本字段用于输入用户的电子邮件 ID 所以我需要在 corona 项目中验证该文本字段中的电子邮件 试试这个正则表达式 local email email protected cdn
  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 使用 apply 函数重写循环

    我有以下 3 个函数 我想使其更快 我认为应用函数是最好的方法 但我从未使用过应用函数 所以我不知道该怎么做 任何类型的提示 想法和代码片段将不胜感激 n T dt 是全局参数 par 是参数向量 函数 1 是创建 m 1 n 矩阵的函数
  • 为什么我不能在 python 的 for 循环中重新分配变量? [复制]

    这个问题在这里已经有答案了 今天我发现一个有趣的事实 我无法在 for 循环 中重新分配变量 但为什么呢 这是我的代码 gt gt gt my list 1 2 3 4 5 gt gt gt for i in my list gt gt g
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 如何在C++中构建复合for循环?

    是另一个fora 的计数器部分 第三部分 允许循环for环形 在我尝试优雅地编写代码来生成直角三角形 我写了这个 但它无法编译 include
  • 如何从 .NET DataGridView 控件单元格值写入文本文件?

    我有以下代码应该循环遍历我的所有行DataGridView 并将其所有单元格值写入文本文件 但是 它输出所有行 但仅输出每行的第一个单元格 而不输出其他三个单元格 string file name C test1 txt var objWr
  • 在循环内重新声明 for 循环变量时出错

    考虑以下 C 程序片段 for int i 0 i lt 5 i int i 10 lt Note the local variable printf d i 它编译时没有任何错误 并且在执行时给出以下输出 1010101010 但如果我用
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • Python lambda 函数没有在 for 循环中正确调用[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 制作一个计算器 我使用 for 循环来绘制按钮 并且尝试使用 lambda 函数 以便仅在按下按钮时调用按钮的操作 而不是在程序启动时立即调用 然而 当我尝试这
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 如何避免javascript中for循环内的for循环

    我已经编写了一段运行良好的代码 我想要一个新数组 其中包含 myArr 中的元素 按照 orderArr 中指定的顺序 但是 它在另一个 for 循环中使用 for 循环来匹配数组元素 var myArr a b c d e var ord
  • 在多个 for 循环中使用相同的变量名是不好的做法吗?

    我只是使用 JSHint 来检查一些 JavaScript 代码 在代码中 我有两个 for 循环 它们的用法如下 for var i 0 i lt somevalue i 因此两个 for 循环都使用 var i 进行迭代 现在 JSHi
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • Bash:循环遍历字符串数组后无法读出带空格的字符串

    我正在使用循环读取数组的内容 该数组包含名为 music 的目录层次结构中的所有目录和文件 内容是 find 命令先前输出的字符串 这个想法是根据流派 艺术家和标题将 directory contents 中每个数组元素的完整目录路径分成子
  • 如何加速 R for 循环?

    我正在为 R 中 GWmodel 包中的 gwr basic 函数运行以下 for 循环 我需要做的是收集任何给定带宽的估计参数的平均值 代码如下 library GWmodel data DubVoter Dub voter LARent

随机推荐