在lua中我们要遍历一个tb,有序数组用ipairs,无序的则会用pairs(借助闭包性质来实现)
直接先上代码
--------------------------------- --数组型 --------------------------------- local tb1 = {3,2,1} for i,v in ipairs(tb1) do print(i,v) end ----------------------------------- --字典型 ----------------------------------- local tb2 = {x=1,y=2,z=3} for k,v in pairs(tb2) do print(k,v) end
泛型for比较复杂,它在循环过程内保存了迭代器函数。它实际上保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。接下来,分别进行总结。
泛型for的语法如下:
for <var-list> in <exp-list> do <body> end
下面是一个展开后的例子:
for k, v in pairs(t) do print(k, v) end -- 就等价于以下代码: for var_1, ..., var_n in <explist> do <block> end do local _f, _s, _var = <explist> -- 返回迭代器函数、恒定状态和控制变量的初值 while true do local var_1, ..., var_n = _f(_s, _var) _var = var_1 if _var == nil then break end <block> end end end
明白上面的代码后那么ipairs和pairs是怎么实现的呢,我们就能自己来写一个了
--------------------------------- --数组型迭代器 --------------------------------- local tb1 = {3,2,1} function iter(tb,i) i = i + 1 if nil == tb[i] then return nil,nil else return i,tb[i] end end function ipairs(tb) return iter,tb,0 end for i,v in ipairs(tb1) do print(i,v) end ----------------------------------- --字典型迭代器 ----------------------------------- local tb2 = {x=1,y=2,z=3} function pairs(tb) return next,tb,nil end for k,v in pairs(tb2) do print(k,v) end
扩展内容:LUA中函数变长参数的使用(利用了变长参数来构造一个TB然后通过迭代器来进行累加)
function getSum(...) local res = 0 for i,v in ipairs{...} do res = res + v end return res end local res = getSum(1,2,3,4,5,6,7,8,9,10) print(res)--输出为55
时间: 2024-10-10 10:01:58