- 系列文章目录
- 前言
- 🌲一、Lua数组
- 🌲1.一维数组
- 🌳2.多维数组
- 🌳二、Lua迭代器
- 🌲1.泛型for的迭代器
- 🌳2.无状态的迭代器
- 🌴3.多状态的迭代器
- 💬🌲🌳🌴🌵总结
数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。
🌲1.一维数组一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例:
print("--------------------数组-------------------")
print("--------------------一维数组---------------")
array1={"Lua","Tutorial"}
for i=0,3
do
print(array1[i])
end
for i=1,2
do
print(array1[i])
end
以上代码的输出结果为:
--------------------数组-------------------
Untitled-1.lua:730
--------------------一维数组---------------
Untitled-1.lua:732
nil
Untitled-1.lua:737
Lua
Untitled-1.lua:737
Tutorial
Untitled-1.lua:737
nil
Untitled-1.lua:737
Lua
Untitled-1.lua:742
Tutorial
-
正如你所看到的,我们可以使用整数索引来访问数组元素,如果知道的索引没有值则返回nil。
-
在 Lua 索引值是以 1 为起始,但你也可以指定 0 开始。
-
除此外我们还可以以负数为数组索引值:
for i=1,2
do
print(array1[i])
end
array2={};
for i=-2,2
do
array2[i]=i*2
end
for i=-2,2
do
print(array2[i])
end
以上代码的输出结果为:
-4
Untitled-1.lua:753
-2
Untitled-1.lua:753
0
Untitled-1.lua:753
2
Untitled-1.lua:753
4
多维数组即数组中包含数组或一维数组的索引键对应一个数组。
以下是一个三行三列的阵列多维数组:
print("------------------------多维数组------------------")
array3={}
for i=1,3
do
array3[i]={}
for j=1,3
do
array3[i][j]=i*j
end
end
print("------------------------访问数组------------------")
for i=1,3
do
for j=1,3
do
print(array3[i][j])
end
end
以上代码的输出结果为:
------------------------多维数组------------------
Untitled-1.lua:757
------------------------访问数组------------------
Untitled-1.lua:769
1
Untitled-1.lua:774
2
Untitled-1.lua:774
3
Untitled-1.lua:774
2
Untitled-1.lua:774
4
Untitled-1.lua:774
6
Untitled-1.lua:774
3
Untitled-1.lua:774
6
Untitled-1.lua:774
9
不用的索引键三行三列数组
array4={}
maxRows=3
maxColumns=3
for rows=1,maxColumns
do
for cols=1,maxColumns
do
array4[rows*maxColumns+cols]=rows*cols
end
end
print("------------------------访问数组------------------")
for rows=1,maxRows
do
for cols=1,maxColumns
do
print(array4[rows*maxColumns+cols])
end
end
--以上的实例中,数组设定了指定的索引值,这样可以避免出现 nil 值,有利于节省内存空间。
以上代码的输出结果为:
------------------------访问数组------------------
Untitled-1.lua:791
1
Untitled-1.lua:796
2
Untitled-1.lua:796
3
Untitled-1.lua:796
2
Untitled-1.lua:796
4
Untitled-1.lua:796
6
Untitled-1.lua:796
3
Untitled-1.lua:796
6
Untitled-1.lua:796
9
以上的实例中,数组设定了指定的索引值,这样可以避免出现 nil 值,有利于节省内存空间。
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。
在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。
🌲1.泛型for的迭代器- 泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。
- 泛型 for 迭代器提供了集合的 key/value 对,语法格式如下:
for k, v in pairs(t) do
print(k, v)
end
上面代码中,k, v为变量列表;pairs(t)为表达式列表。
查看以下实例:
print("-----------------迭代器-------------")
---语法 key,value键值模型,pairs和inpairs的区别,pairs 和 ipairs区别:table和数组的区别 ,返回nil时候的区别
--pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
--ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
s={1,2}
for k,v in pairs(s)
do
print(k,v)
end
array5={"Hello","world"}
for key,value in ipairs(array5)
do
print(key,value)
end
以上代码的输出结果为:
-----------------迭代器-------------
Untitled-1.lua:804
1 1
Untitled-1.lua:812
2 2
Untitled-1.lua:812
1 Hello
Untitled-1.lua:819
2 world
以上实例中我们使用了 Lua 默认提供的迭代函数 ipairs。
- 下面我们看看泛型 for 的执行过程:
- 首先,初始化,计算 in 后面表达式的值,表达式应该返回泛型 for 需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用 nil 补足,多出部分会被忽略。
- 第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
- 第三,将迭代函数返回的值赋给变量列表。
- 第四,如果返回的第一个值为nil循环结束,否则执行循环体。
- 第五,回到第二步再次调用迭代函数。
在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。Lua 的迭代器包含以下两种类型:
- 无状态的迭代器。
- 多状态的迭代器。
-
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
-
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
-
这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素,元素的索引需要是数值。
以下实例我们使用了一个简单的函数来实现迭代器,实现 数字 n 的平方:
-----无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们无可以利用无状态迭代器避免创建闭包花费额外的代价。
-----每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
-----这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素,元素的索引需要是数值。
-----以下实例我们使用了一个简单的函数来实现迭代器,实现 数字 n 的平方:
-----0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?