首先我们看一下ipairs的写法:
local tbl = {"a","b","c"}
for i, var in ipairs(tbl) do
print(i, var)
end
--1 a
--2 b
--3 c
local tbl = {a="x",b="y",c="z"}
for key, var in pairs(tbl) do
print(key, var)
end
--a x
--b y
--c z
那么它们是怎么实现的呢?我们一步一步来,首先我们实现一个迭代器方法:
local function inverse(max, idx)
if idx < max then
idx = idx + 1
return idx, -idx
end
end
使用:
for i, n in inverse, 3, 0 do
print(i, n)
end
--1 -1
--2 -2
--3 -3
我们看到in后面有三个值,第一个就是我们自定义的迭代器方法inverse,而后面两个就是inverse方法的两个起始参数,最大值和idx,把第三个值从0改成1的话,我们会看到打印结果是从2开始的。
那么为什么写法和ipairs/pairs不一样呢?因为ipairs/pairs并不是迭代器方法,而是迭代器的生成器方法。我们可以写一个迭代器生成器方法:
local function toinverse(count)
return inverse, count, 0
end
使用:
for i, n in toinverse(2) do
print(i,n)
end
--1 -1
--2 -2
max = max / 2
这里我们考虑使用闭包:
local function inversenumber(max)
local m = max
return function(max, idx)
m = m / 2
if idx < m then
idx = idx + 1
return idx, -idx
end
end
,count,0
end
使用:
for i, n in inversenumber(1024) do
print(i, n)
end
会从1打印到7。
我们这里使用m来保存最大值的状态,这就跟迭代器方法的参数max没有关系了。