手机网站设计教育类模板,鲜花销售网站模板,网站架设地址,安卓手机app制作公司一、Lua数组
数组#xff0c;就是相同数据类型的元素按一定顺序排列的集合#xff0c;可以是一维数组和多维数组。 在 Lua 中#xff0c;数组不是一种特定的数据类型#xff0c;而是一种用来存储一组值的数据结构。 实际上#xff0c;Lua 中并没有专门的数组类型#xf…一、Lua数组
数组就是相同数据类型的元素按一定顺序排列的集合可以是一维数组和多维数组。 在 Lua 中数组不是一种特定的数据类型而是一种用来存储一组值的数据结构。 实际上Lua 中并没有专门的数组类型而是使用一种被称为 “table” 的数据结构来实现数组的功能。 Lua 数组的索引键值可以使用整数表示数组的大小不是固定的。 在 Lua 索引值是以 1 为起始但你也可以指定 0 开始。
一一维数组
一维数组是最简单的数组其逻辑结构是线性表。 使用索引访问数组元素 -- 创建一个数组local myArray {10, 20, 30, 40, 50}-- 访问数组元素print(myArray[1]) -- 输出 10print(myArray[3]) -- 输出 30要计算数组的长度即数组中元素的个数你可以使用 # 操作符 local myArray {10, 20, 30, 40, 50}-- 计算数组长度local length #myArrayprint(length) -- 输出 5array {Lua, Tutorial}for i 0, 2 doprint(array[i])
end正如你所看到的我们可以使用整数索引来访问数组元素如果指定的索引没有值则返回 nil。
除此外我们还可以以负数为数组索引值
array {}for i -2, 2 doarray[i] i *2
endfor i -2,2 doprint(array[i])
end二多维数组
多维数组即数组中包含数组或一维数组的索引键对应一个数组。
以下是一个三行三列的阵列多维数组
-- 初始化数组
array {}
for i1,3 doarray[i] {}for j1,3 doarray[i][j] i*jend
end-- 访问数组
for i1,3 dofor j1,3 doprint(array[i][j])end
end不同索引键的三行三列阵列多维数组
-- 初始化数组
array {}
maxRows 3
maxColumns 3
for row1,maxRows dofor col1,maxColumns doarray[row*maxColumns col] row*colend
end-- 访问数组
for row1,maxRows dofor col1,maxColumns doprint(array[row*maxColumns col])end
end1
2
3
2
4
6
3
6
9
二、Lua迭代器
迭代器iterator是一种对象它能够用来遍历标准模板库容器中的部分或全部元素每个迭代器对象代表容器中的确定的地址。 在 Lua 中迭代器是一种支持指针类型的结构它可以遍历集合的每一个元素。
一泛型 for 迭代器
泛型 for 在自己内部保存迭代函数实际上它保存三个值迭代函数、状态常量、控制变量。 泛型 for 迭代器提供了集合的 key/value 对语法格式如下
for k, v in pairs(t) doprint(k, v)
end
上面代码中k, v为变量列表pairs(t)为表达式列表。 查看以下实例:
array {Google, Runoob}for key,value in ipairs(array)
doprint(key, value)
end1 Google
2 Runoob
以上实例中我们使用了 Lua 默认提供的迭代函数 ipairs。下面我们看看泛型 for 的执行过程首先初始化计算 in 后面表达式的值表达式应该返回泛型 for 需要的三个值迭代函数、状态常量、控制变量与多值赋值一样如果表达式返回的结果个数不足三个会自动用 nil 补足多出部分会被忽略。
第二将状态常量和控制变量作为参数调用迭代函数注意对于 for 结构来说状态常量没有用处仅仅在初始化时获取他的值并传递给迭代函数。
第三将迭代函数返回的值赋给变量列表。
第四如果返回的第一个值为nil循环结束否则执行循环体。
第五回到第二步再次调用迭代函数
在Lua中我们常常使用函数来描述迭代器每次调用该函数就返回集合的下一个元素。Lua 的迭代器包含以下两种类型- 无状态的迭代器
- 多状态的迭代器二无状态的迭代器
无状态的迭代器是指不保留任何状态的迭代器因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。 每一次迭代迭代函数都是用两个变量状态常量和控制变量的值作为参数被调用一个无状态的迭代器只利用这两个值可以获取下一个元素。 这种无状态迭代器的典型的简单的例子是 ipairs它遍历数组的每一个元素元素的索引需要是数值。 以下实例我们使用了一个简单的函数来实现迭代器实现数字 n 的平方
function iter (a, i)i i 1local v a[i]if v thenreturn i, vend
endfunction ipairs (a)return iter, a, 0
end三多状态的迭代器
很多情况下迭代器需要保存多个状态信息而不是简单的状态常量和控制变量最简单的方法是使用闭包还有一种方法就是将所有的状态信息封装到 table 内将 table 作为迭代器的状态常量因为这种情况下可以将所有的信息存放在 table 内所以迭代函数通常不需要第二个参数。 以下实例我们创建了自己的迭代器
array {Google, Runoob}function elementIterator (collection)local index 0local count #collection-- 闭包函数return function ()index index 1if index countthen-- 返回迭代器的当前元素return collection[index]endend
endfor element in elementIterator(array)
doprint(element)
end