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-- pythonend--[[ ok,正如上面输出的一样 可以使用整数索引来访问数组元素,如果索引没有对应的值,则返回nil Lua的索引是以1位起始的,但也可以指定0开始 除此之外,还可以用负数作为数组的索引值]]array = {}for i=-2,2 do array[i] = i * 2endfor i = -2,2 do print(array[i])-- -4-- -2-- 0-- 2-- 4endprint("\n\n")
-- 多维数组-- 数组中包含数组或一维数组的索引键对应一个数组-- 以下是一个三行三列的阵列多为数组-- 初始化数组array = {}for i=1,3 do array[i] = {} for j=1,3 do array[i][j] = i*j endend-- 访问数组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 endprint("\n")-- 不同索引键的三行三列阵列多维数组-- 初始化数组array = {}maxRows = 3maxColumns = 3for row=1,maxRows do for col=1,maxColumns do array[row*maxColumns + col] = row*col endend-- 访问数组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 Bingend--[[ 以上实例,使用了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 endendfor 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 endendfunction ipairs(a) return iter,a,0end-- 当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 endendfor element in elementIterator(array) do print(element)-- Google-- Bing-- Baiduend-- 以上实例中,可以看到,elementIterator内使用了闭包函数,实现计算集合大小并输出各个元素

扫码关注一下呗~

以上是关于Lua数组Lua迭代器的主要内容,如果未能解决你的问题,请参考以下文章

lua自定义迭代器

Lua 迭代器

如何在 Lua 中的二维表上创建迭代器?

Lua_isms

lua 10 迭代器

lua 迭代器 iterator