function iter (a, i)
local v = a[I+1]
if v then
return i+1, v
end
end
自定义pairs迭代器:
function mypairs(a)
return next, a, nil
end
自定义限制循环中增加table元素的迭代器
function xpairs(a)
local size = table.maxn(a)
local function iter(a, k)
local t = table.maxn(a)
if t > size then
return
end
return next(a, k)
end
return iter, a, nil
end
--例如
local xx = {1, 2, 3, 4}
for k, v in xpairs(xx) do
print(k, v)
-- xx[#xx+1] = v+4
end
自定义限制循环次数的迭代器
function xpairs(a)
local size = table.maxn(a)
if size > 32 or size == 0 then
size = 32
end
local t = 0
local function iter(a, k)
t = t + 1
if t > size then
return
end
return next(a, k)
end
return iter, a, nil
end
迭代器(iterator)是一种数据结构,能够遍历集合的每个元素。在lua中是一种支持指针类型的结构。
lua中熟知的迭代器有
pairs
和ipairs
。通常配合泛型for
同时使用。例如:
我们自己也可以实现一个类似于ipairs的功能
使用自定义的迭代器也可以实现类似ipairs的功能
通过自定义的迭代器函数可以看出是泛型
for
在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。in
后面表达式的值,表达式应该返回范性for
需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用nil补足,多出部分会被忽略。:loudspeaker: 注: 第二步是真正
for
循环的开始。第一步只是准备(如果理解了闭包,其实就是调用返回闭包)。迭代器返回的就是控制变量和控制变量对应的值,把上述自定义函数修改一下可能更容易理解。自定义pairs迭代器:
自定义限制循环中增加table元素的迭代器
自定义限制循环次数的迭代器