我们继续来学一些东西 多维数组 数组这东西咱们之前其实已经学过了,基本上没什么说的了,因为lua里面数组字典都是一个东西
但是有一个东西不得不提那就是table的数组的一面的多维数组性
说人话就是和其他语言一样,lua的数组也可以嵌套,而且用法一模一样
二维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 local matrix = { { 1 , 2 , 3 }, { 4 , 5 , 6 }, { 7 , 8 , 9 } } print (matrix[1 ][1 ]) print (matrix[2 ][3 ]) print (matrix[3 ][2 ]) for i = 1 , #matrix do for j = 1 , #matrix[i] do io .write (matrix[i][j], " " ) end print () end
三维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 local cube = { { { 1 , 2 }, { 3 , 4 } }, { { 5 , 6 }, { 7 , 8 } } } for i = 1 , #cube do print ("layer" , i) for j = 1 , #cube[i] do for k = 1 , #cube[i][j] do io .write (cube[i][j][k], " " ) end print () end print () end
递归遍历数组 因为手动敲代码非常麻烦,而且每增加一层数组就要套上一个for循环,所以我们采用递归遍历,实现一劳永逸
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 local function walkArray (t, callback, path) path = path or {} for k, v in pairs (t) do path [#path + 1 ] = k if type (v) == "table" then walkArray(v, callback, path ) else callback(v, path ) end path [#path ] = nil end end local cube = { { { 1 , 2 , 3 }, { 4 , 5 , 6 } }, { { 7 , 8 , 9 }, { 10 , 11 , 12 } } } walkArray(cube, function (value, path) io .write ("index " ) for i = 1 , #path do io .write ("[" .. path [i] .. "]" ) end print (" = " .. value) end )
你别说,我真的看不懂这写的什么意思,我以前从来没有认真看过递归(因为用不上我也从来不看这个),现在理解起来还是有点困难的
迭代器 迭代器包括泛型 for 迭代器,无状态的迭代器,多状态的迭代器
其中泛型 for 迭代器我们已经学过了,我们就不说了,这个就是我们前面说的遍历表的ipairs和pairs这些东西
泛型 for 迭代器 语法为
1 2 3 for var_1, var_2 in iterator_func, state, init do end
泛型 for 部分
作用
具体值
iterator_func
每次迭代被调用的函数(返回下一个值)
square
state
迭代器固定数据(不会变的东西)
3 (最大迭代次数)
init
迭代器固定数据(不会变的东西)
0 (控制变量初始值)
var_1, var_2
循环体变量,用来接收迭代器返回值
i, n(循环体变量)
例如
1 2 3 4 5 6 7 8 9 array = {"Google" , "Runoob" } for key,value in ipairs (array) do print (key, value) end -
函数
类型
功能
ipairs(t)
无状态
按索引顺序遍历数组部分
pairs(t)
多状态
遍历表中所有键值对
string.gmatch(s, pattern)
多状态
按模式匹配字符串
io.lines(filename)
多状态
按行读取文件
无状态的迭代器(stateless iterator)
无状态 :迭代函数本身不保存任何内部状态,它只依赖两个输入:
状态常量 (通常是固定的数据集合,比如表)
控制变量 (循环中表示当前位置的索引或计数器)
循环机制 :每一次迭代,Lua 都调用迭代函数 f(state, control),由迭代函数返回下一个元素
优势 :不需要闭包开销,效率高,适合简单、固定的序列遍历
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 local function iter (n, i) i = i + 1 if i <= n then return i end end local n = 5 for i in iter, n, 0 do print (i) end 解析: iter 是迭代器函数,每次被调用时接收两个参数: n(state) i(上一次返回的值,初始是 0 ) 返回下一个值,直到返回 nil 时循环结束 特点:迭代器本身不记状态,状态由循环外部传递进来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function square (iteratorMaxCount, currentNumber) if currentNumber < iteratorMaxCount then currentNumber = currentNumber + 1 return currentNumber, currentNumber * currentNumber end end for i, n in square, 3 , 0 do print (i, n) end 解析: 迭代函数:square(iteratorMaxCount, currentNumber) 每次被调用,传入状态常量 iteratorMaxCount(最大迭代次数)和控制变量 currentNumber(上一次返回的值) 返回值:返回下一个索引和它的平方 Lua 的 for 循环会不断调用 square,直到返回 nil 停止
多状态的迭代器(stateful iterator)
多状态 :迭代器需要维护多个状态,可能包括:
实现方式 :
闭包 :迭代函数内保存状态变量。
表封装状态 :状态信息放在 table 中,迭代函数每次读取。
特点 :迭代器自己记住状态,循环不必每次传入控制变量。
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 local function next_pair (t) local key = nil return function () key = next (t, key) if key then return key, t[key] end end end local t = {a=1 , b=2 , c=3 }for k, v in next_pair(t) do print (k, v) end 解析: next_pair(t) 返回一个闭包函数,这个闭包保存了内部状态(key)。 每次调用闭包,都会从表中取下一个键值对。 循环结束条件是闭包返回 nil 。 特点:迭代器自己保存状态,外部循环无需传递状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 local array = {"Google" , "Runoob" }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) end
评论区