Lua数组Lua迭代器
Posted 为啥取个名字这么烦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua数组Lua迭代器相关的知识,希望对你有一定的参考价值。
-- Lua数组
--[[ 数组,就是相同数据类型的元素按照一定的顺序排列的集合,可以是一维数组和多维数组
Lua数组的索引键值可以使用整数表示,数组的大小不是固定的
一维数组
最简单的数组,其逻辑结构是线性表,一维数组可以用for循环出数组的元素。
来,上实例
]]
array = {"Lua","C","C++","Objective-C","Java","python"}
for i=0,6 do
print(array[i])
-- nil
-- Lua
-- C
-- C++
-- Objective-C
-- Java
-- python
end
--[[ ok,正如上面输出的一样
可以使用整数索引来访问数组元素,如果索引没有对应的值,则返回nil
Lua的索引是以1位起始的,但也可以指定0开始
除此之外,还可以用负数作为数组的索引值
]]
array = {}
for i=-2,2 do
array[i] = i * 2
end
for i = -2,2 do
print(array[i])
-- -4
-- -2
-- 0
-- 2
-- 4
end
print("\n\n")
-- 多维数组
-- 数组中包含数组或一维数组的索引键对应一个数组
-- 以下是一个三行三列的阵列多为数组
-- 初始化数组
array = {}
for i=1,3 do
array[i] = {}
for j=1,3 do
array[i][j] = i*j
end
end
-- 访问数组
for i=1,3 do
output = ""
for j=1,3 do
output = string.format("%s %d ",output,array[i][j])
end
print(output)
-- 1 2 3
-- 2 4 6
-- 3 6 9
end
print("\n")
-- 不同索引键的三行三列阵列多维数组
-- 初始化数组
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
for col=1,maxColumns do
array[row*maxColumns + col] = row*col
end
end
-- 访问数组
for row=1,maxRows do
output = ""
for col=1,maxColumns do
output = string.format("%s %d ",output,array[row*maxColumns + col])
end
print(output)
-- 1 2 3
-- 2 4 6
-- 3 6 9
end
-- 以上实例中,数组设定了指定的索引值,这样可以避免出现nil值,有利于节省内存空间
-- ****************************************************************************************
-- ****************************************************************************************
-- ****************************************************************************************
print("\n\n")
-- ****************************************************************************************
-- ****************************************************************************************
-- ****************************************************************************************
--[[ Lua迭代器
迭代器其实是一种对象,可以用来遍历标准模版库中的元素。
泛型for迭代器
泛型for在自己内部保存迭代函数,它保存三个值:迭代函数、状态常量、控制变量
泛型for迭代器提供了集合的key/value对,语法格式如下
for key, value in pairs(iter) do
print(key, value)
end
key,value 都是变量列表;pairs(iter) 是表达式列表
来看看实例
]]
array = {"Google","Baidu","Bing"}
for key, value in ipairs(array) do
print(key, value)
-- 1 Google
-- 2 Baidu
-- 3 Bing
end
--[[ 以上实例,使用了Lua默认提供的迭代函数ipairs
解析泛型for的执行过程
Step1:先进行初始化,计算 in 后面表达式的值,表达式应该返回泛型for需要的三个值:迭代函数、状态常量、控制变量,与多值赋值一样,如果表达式返回的结果个数不足三个会自动用nil补充,多出部分则会被自动忽略掉
Step2:将状态常量和控制变量作为参数调用迭代函数(对于for结构来说,状态常量没有用处,仅仅在初始化时获取它的值并创递给迭代函数)
Step3:将迭代函数返回的值赋给变量列表
Step4:如果返回的第一个值为nil循环结束,否则执行循环体
Step5:回到Step2再次调用迭代函数
在Lua中常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素,
Lua语言的迭代器包含以下两种类型:
无状态的迭代器
多状态的迭代器
无状态的迭代器
是指不保留任何状态的迭代器,因此在循环中可以利用无状态迭代器避免创建闭包花费额外的代价
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素
这种无状态迭代器的典型的简单的例子是ipairs,它遍历数组的每一个元素
实例:使用一个简单的函数来实现迭代器,数字n的平方
]]
function my_square(imCount, cNumber)
if cNumber < imCount then
cNumber = cNumber + 1
return cNumber,cNumber*cNumber
end
end
for ind, val in my_square,4,1 do
print (ind, val)
end
-- 2 4
-- 3 9
-- 4 16
-- 迭代的状态包括被遍历的表(循环过程中不会改变的状态常量)和当前的索引下标(控制变量)
-- ipairs和迭代函数都很简单,可以这样实现
function iter(a, i)
i = i + 1
local v = a[i]
if v then
return i,v
end
end
function ipairs(a)
return iter,a,0
end
-- 当Lua调用ipairs(a)开始循环时,他获取三个值:迭代函数iter、状态常量a、控制变量初始值0
-- 然后Lua调用iter(a,0)返回1,a[1](除非a[1]=nil) 第二遍迭代调用iter(a,1),返回2,a[2],...,直到第一个nil元素
print("\n\n")
--[[ 多状态迭代器
很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法就是使用闭包,
还有一种方法就是将所有的状态信息封装到table内,将table作为迭代器的状态常量,因为这种情况下可以
将所有的信息存放在table内,所以迭代器通常不需要第二个参数。
来看看例子,创建自己的迭代器
]]
array = {"Google","Bing","Baidu"}
function elementIterator(collection)
local index = 0
local count = #collection
-- 闭包函数
return function ()
index = index + 1
if index <= count then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array) do
print(element)
-- Bing
-- Baidu
end
-- 以上实例中,可以看到,elementIterator内使用了闭包函数,实现计算集合大小并输出各个元素
扫码关注一下呗~
以上是关于Lua数组Lua迭代器的主要内容,如果未能解决你的问题,请参考以下文章