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。
一个不太技术性的描述可能是:
此外,同时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(使用前将#替换为@)