- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是:
for key, value in pairs(tbtest) do
XXX
end
for key, value in ipairs(tbtest) do
XXX
end
for i=1, #(tbtest) do
XXX
end
for i=1, table.maxn(tbtest) do
XXX
end
前两种是泛型遍历,后两种是数值型遍历。当然你还会说lua的table遍历还有很多种方法啊,没错,不过最常见的这些遍历确实有必要弄清楚。
这四种方式各有特点,由于在工作中我几乎每天都会使用遍历table的方法,一开始也非常困惑这些方式的不同,一段时间后才渐渐明白,这里我也是把自己的一点经验告诉大家,对跟我一样的lua初学者也许有些帮助(至少当初我在写的时候在网上就找了很久,不知道是因为大牛们都认为这些很简单,不需要说,还是因为我笨,连这都要问)。
首先要明确一点,就是lua中table并非像是C/C++中的数组一样是顺序存储的,准确来说lua中的table更加像是C++中的map,通过Key对应存储Value,但是并非顺序来保存key-value对,而是使用了hash的方式,这样能够更加快速的访问key对应的value,我们也知道hash表的遍历需要使用所谓的迭代器来进行,同样,lua也有自己的迭代器,就是上面4种遍历方式中的pairs和ipairs遍历。但是lua同时提供了按照key来遍历的方式(另外两种,实质上是一种),正式因为它提供了这种按key的遍历,才造成了我一开始的困惑,我一度认为lua中关于table的遍历是按照我table定义key的顺序来的。
下面依次来讲讲四种遍历方式,首先来看for k,v in pairs(tbtest) do这种方式:
先看效果:
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
}
for key, value in pairs(tbtest) do
print(value)
end
我认为输出应该是1,2,3,4,实际上的输出是1,2,4,3。我因为这个造成了一个bug,这是后话。
也就是说for k,v in pairs(tbtest) do 这样的遍历顺序并非是tbtest中table的排列顺序,而是根据tbtest中key的hash值排列的顺序来遍历的。
当然,同时lua也提供了按照key的大小顺序来遍历的,注意,是大小顺序,仍然不是key定义的顺序,这种遍历方式就是for k,v in ipairs(tbtest) do。
for k,v in ipairs(tbtest) do 这样的循环必须要求tbtest中的key为顺序的,而且必须是从1开始,ipairs只会从1开始按连续的key顺序遍历到key不连续为止。
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[5] = 5,
}
for k,v in ipairs(tbtest) do
print(v)
end
只会打印1,2,3。而5则不会显示。
local tbtest = {
[2] = 2,
[3] = 3,
[5] = 5,
}
for k,v in ipairs(tbtest) do
print(v)
end
这样就一个都不会打印。
第三种遍历方式有一种神奇的符号#,这个符号的作用是是获取table的长度,比如:
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
}
print(#(tbtest))
打印的就是3
tbtest = {
[1] = 1,
[2] = 2,
[6] = 6,
}
print(#(tbtest))
这样打印的就是2,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,‘#’都会查找key为1的值开始。
如果table的定义是这样的:
tbtest = {
[a] = 1,
[2] = 2,
[3] = 3,
}
print(#(tbtest))
那么打印的就是0了。因为‘#’没有找到key为1的值。同样:
tbtest = {
[“a”] = 1,
[“b”] = 2,
[“c”] = 3,
}
print(#(tbt
您可能关注的文档
- ICU常用急救药物的使用解析.ppt
- c1人力资源管理与开发概论解析.ppt
- ICU常用药物2016.06.06解析.ppt
- ICU的设计规范解析.doc
- ICU的镇静与镇痛解析.ppt
- ICU侵袭性真菌感染治疗指南解析.ppt
- ICU心功能不全患者的液体治疗策略解析.ppt
- C4制异辛烷解析.doc
- ICU中血液净化的应用指南解析.doc
- IC封装工艺简介解析.ppt
- 2024至2030年小条砖项目投资价值分析报告.docx
- 2024至2030年室外广告牌项目投资价值分析报告.docx
- 2024至2030年小号夜光盖金字塔口杯项目投资价值分析报告.docx
- 2024至2030年小童椅项目投资价值分析报告.docx
- (完整版)100以内加减法大全_天天练(可打印).docx
- 2024至2030年导电衬垫项目投资价值分析报告.docx
- 2024至2030年小捞网项目投资价值分析报告.docx
- 2024至2030年市政交通护栏项目投资价值分析报告.docx
- 2024至2030年布艺盒项目投资价值分析报告.docx
- 2024至2030年工艺孔盖项目投资价值分析报告.docx
最近下载
- 2020年上海社会科学院科研岗位招聘试题及答案.doc
- 05G511:梯形钢屋架 国标图集.pdf VIP
- 党员“一带一”活动J计划、实施方案及协议书4.doc VIP
- 东北电力大学2022-2023学年《数据结构》期末考试试卷(A卷)附参考答案.docx
- 2022年广州工商学院退役军人综合考察真题.pdf
- 05-G511 梯形钢屋架 标准图集.pdf VIP
- 成人住院患者静脉血栓栓塞症的预防护理-中华护理学会团体标准2023.pptx
- 线下沙龙策划方案.docx VIP
- 2023年浙江中医药大学数据科学与大数据技术专业《数据库原理》科目期末试卷A(有答案).docx VIP
- 设计说明书(履带式行走底盘).pdf
文档评论(0)