Lua 数组和迭代器简介

举报
陈言必行 发表于 2021/08/14 01:27:04 2021/08/14
【摘要】 数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。 Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。 注:我们可以使用整数索引来访问数组元素,如果知道的索引没有值则返回nil。 在 Lua 索引值是以 1 为起始,但你也可以指定 0 开始。 除此外我们还可以以负数为数组索引值: -- 一维数组就不再赘述了 -- 二...

数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。


注:我们可以使用整数索引来访问数组元素,如果知道的索引没有值则返回nil。
在 Lua 索引值是以 1 为起始,但你也可以指定 0 开始。
除此外我们还可以以负数为数组索引值:

-- 一维数组就不再赘述了

-- 二维数组的遍历
array = {{1,2},{3,4},{5,6},{7,8}}

for i=1,4 do for j=1,2 do print(array[i][j]) end
end


-- 初始化二维数组
array1 = {}
for i=1,4 do array1[i] = {} for j=1,2 do array1[i][j] = i+j end
end

-- 遍历访问数组
for i=1,4 do for j=1,2 do print(array1[i][j]) end
end

-- 多维数组也是一样,只要把每个二维数组元素替换为一个一维数组就是三维数组了,同理类推,,,
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址
在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。

array = {"Lua", "C#","js","Boo"}

for k,v in ipairs(array) 
do print(k, v)
end
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

pairs 和 ipairs区别:
pairs: 迭代 数组,可以遍历表中所有的 key 可以返回 nil
ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出

示例说明:

local tabFiles = {"Lua", "C#",[3] = "js",["haha"]="Boo"}} --第四个key不是整数,所以只输出前三个
for i,v in ipairs(tabFiles ) do print( tabFiles [i] ) end --全部输出 
for i,v in pairs(tabFiles ) do print( tabFiles [i] ) end 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

无状态的迭代器
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
这种无状态迭代器的典型的简单的例子是ipairs,他遍历数组的每一个元素。

多状态的迭代器
很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到table内,将table作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在table内,所以迭代函数通常不需要第二个参数。

推荐查看:http://www.runoob.com/lua/lua-strings.html

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/78443420

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。