Lua中 ipairs 和 pairs 的区别是什么?

2021-06-02 15:48发布

7条回答

lua 中pairs 和 ipairs区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的
(string.gmatch)等等。LUA手册中对与pairs,ipairs解释如下:

ipairs (t)
Returns three values: an iterator function, the table t, and 0, so that the construction
for i,v in ipairs(t) do body end

will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.

三岁奶猫
3楼 · 2021-06-03 13:48

ipairs遇到nil会停止,pairs会输出nil值然后继续下去,

ipairs并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。

而pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。


yuixan
4楼 · 2021-06-03 15:36
词性不同,用法也不同;pairs 是名词,指“数对”,用作主语或宾语。in pairs 是副词性介词短语,意思是“成双地”、“成对地” ,表述状态或方式。
aijingda
5楼 · 2021-06-04 11:59

官方文档上的说明:

ipairs (t)

Returns three values: an iterator function, the table t, and 0, so that the construction

for i,v in ipairs(t) do body end

will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.

pairs (t)

Returns three values: the next function, the table t, and nil, so that the construction

for k,v in pairs(t) do body end

will iterate over all key–value pairs of table t.

See function next for the caveats of modifying the table during its traversal.

这样就可以看出 ipairs以及pairs 的不同。pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key。


茄子酱
6楼 · 2021-06-11 14:29

迭代器for遍历table时,ipairs和pairs的区别:

区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去

区别二:

复制代码

local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"}-- for i,v in ipairs(a) do--     print(v)-- endfor k,v in pairs(a) do
    print(k,v)end

复制代码

可见:ipairs并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。

而pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。

这是因为,table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,并不会按照键的字母顺序或是数字顺序存储。

=》对于a来说,如果执行print(a[3]),输出的结果也会是Good。也就是说table并不会给键值对一个索引值。

也就是说,ipairs知识按照索引值顺序,打印出了table中有索引的数据,没有索引值的不管。

而pairs是先按照索引值打印,打印完成后再按照键值对的键的哈希值打印它的值。


小狮子
7楼 · 2021-08-06 15:42

正常情况下,使用pairs和ipairs遍历table或数组,没有任何的区别,如下示例所示:

local tbl1 = { "apple", "pear", "orange", "grape" }

print("=============ipairs的执行结果=============")

for i, v in ipairs(tbl1) do

    print(i, '=', v)

end

print("=============pairs的执行结果==============")

for i, v in pairs(tbl1) do

    print(i, '=', v)

end


—执行结果如下:

=ipairs的执行结果=

1 = apple

2 = pear

3 = orange

4 = grape

=pairs的执行结果==

1 = apple

2 = pear

3 = orange

4 = grape

看一下自定义的key值,通过pairs和ipairs输出会是什么情况呢,如下所示:

local tbl2 = {}

tbl2[1] = "1"

tbl2[2] = "2"

tbl2[3] = "3"

tbl2[5] = "5"

print("=============ipairs的执行结果=============")

for i, v in ipairs(tbl2) do

    print(i, '=', v)

end

print("=============pairs的执行结果=============")

for i, v in pairs(tbl2) do

    print(i, '=', v)

end

print('tbl2的长度为:', #tbl2)--长度输出为3,实际上数组中的长度是4


执行结果如下所示:

=ipairs的执行结果=

1 = 1

2 = 2

3 = 3

从执行结果发现,最后一个元素没有了

=pairs的执行结果=

1 = 1

2 = 2

3 = 3

5 = 5

tbl2的长度为: 3

从以上可以发现,其实ipairs会依据key的数值从1开始加1递增遍历相应的table[i]值。 而pairs则能够遍历表中全部的key,而且除了迭代器本身以及遍历表本身还能够返回nil,可是ipairs则不能返回nil,仅仅能返回数字0,遇到nil则循环退出。 它仅仅能遍历到表中出现的第一个不是整数的key.

再看下例子,验证一下:

local tbl3 = {2, s1 = "s1", s2 = "s2", s3 = "s3" }

print("=============ipairs的执行结果=============")

for i, v in ipairs(tbl3) do

    print(i, '=', v)

end

print("=============pairs的执行结果=============")

for i, v in pairs(tbl3) do

    print(i, '=', v)

end

=============ipairs的执行结果=============

1   =   2

=============pairs的执行结果=============

1   =   2

s1  =   s1

s3  =   s3

s2  =   s2


结论:遍历table或array时,如果key是非数字,请使用pairs迭代遍历。

当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。


果果宝贝
8楼 · 2021-09-24 09:28
lua 中pairs 和 ipairs区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 
(string.gmatch)等等。LUA手册中对与pairs,ipairs解释如下:

ipairs (t)
Returns three values: an iterator function, the table t, and 0, so that the construction
for i,v in ipairs(t) do body end

will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.


相关问题推荐

  • 回答 6

    第一步:对着Assets点击右键,选择ExportPackage第二步:选择场景文件以及和场景相关的资源或者素材,然后点击Export第三步:给导出的资源取名,并且选择要保存的位置即可

  • 回答 87
    已采纳

    玩游戏玩的很好,说明你对于游戏里面的规则、剧情设置还是比较了解的,对于从事游戏相关岗位来说也是优势之一。但是学习游戏开发还是要对游戏开发的工作内容做进一步的了解,游戏开发涉及代码较多,可以通过进一步的了解,判断自己是否适合学习这个方向,另外...

  • 回答 11

    游戏开发入门不难。后期发展需要你有丰富的奇思妙想。游戏开发肯定是培训好,自学学得不系统,并且不易发现自身薄弱之处。游戏开发的学习时长还是要看你自己对知识与技术的掌握能力,一般来说,游戏开发的学习时长大约在五个月左右。...

  • 回答 18

    个人觉得如果有一定的技术基础的话还是可以考虑自学,如果零基础的话可能会有些难度

  • 回答 10

    问题还是出在粒子的sorting fudge。在unity的2d模式下,游戏本身的背景相当于是sorting fudge的0,当你把粒子的sorting fudge设为0以上的时候,粒子就都会被背景盖住。所以在3d模式下给alpha正值来给add垫底的话,到了2d模式下就会通通不显示。所以遇上这样的...

  • 回答 17

    虚幻4引擎,你会看到和平精英加载页面左下角有这个图标。

  • 回答 8
    已采纳

    转载知乎上的两位答友的回答,各有道理。作者:风小锐链接:https://www.zhihu.com/question/322249959/answer/675883379来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。未来Unity有可能出现3A大作吗? 有可能。基于Unity已...

  • 回答 11

    在Assets文件夹里面.点击右键Create/Material即可以创建材质球

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 18

    粒子系统由粒子发射器、粒子动画器和粒子渲染器三部分组成,主要用于游戏场景中一些特殊效果,如水、烟火等等

  • 回答 18

    首先,Python开发游戏非常尴尬,原因是没有好用的游戏开发库。Python开发游戏仅推荐PyGame,PyGame是对多年以前很流行的游戏开发库——SDL的封装。但是说实话功能太简陋了,做个动画都得考虑刷新的问题。楼主要做简单小游戏,只需要画一两周熟悉Unity引擎,然...

  • 回答 9

    1.标记水体碰撞的位置2.计算水波的传递 通过波动公式,3D或者2D 波动公式都行3.水面顶点采样波动传递结果计算结果做顶点Y轴偏移

  • 回答 15

    Unity3D中两种阴影的实现传统的ShadowMapShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。具体实现分以下几个步骤:如果有平行光开启了阴影,Unity就会为该光源计算它...

  • 回答 18

    Doozy UI是Unity UI视图层的框架,本身使用的还是UGUI的组件,但提供了一套强大的UI管理功能,可以很方便的实现一些炫酷效果,方便的UI系统管理与事件传递机制。

  • 回答 12

    Unity3d更好,因为U3D占有的市场更大,目前cocos大都是用来开发棋牌游戏的,在这方面它有着巨大的优势。而Unity3d既可以用来开发大型3D游戏,也可以用来开发vr游戏、vr应用,这是比较不错的,未来有着巨大的前景。另外ue4也是个不错的选择,近年来用ue4开发的...

  • 回答 11

    当Unity 需要做热更新的时候(2013年开始),而普通的C#又做不到的时候,而对于游戏行业来说Lua脚本热更新已经是很成熟的方案,自然Lua 热更新就成为了Unity热更新的首选。

没有解决我的问题,去提问