lua里的迭代器可以想成是java里的foreach循环。
大家都知道java里的foreach是一个语法糖,只要一个类实现了iterable,就可以使用foreach来迭代他里面的每一个元素,实际上就是调用该迭代器然后展开一个while循环。(c#以及各种语言都有类似的概念)。
lua里的这个foreach稍微有点不同,他的table不是天生可以迭代的,而是需要提供一个迭代器函数,这个迭代器函数的要求非常宽松,基本上传入一个值返回一个值的函数都可以。
我们先来看一个例子
function values(t)
local i=0
return function() i=i+1;return t[i] end
end
for v in values({1,2,3}) do
print(v)
end
如果在java,c#有自己实现过iterable的人肯定能看出来那个迭代器函数有眼熟的地方。
那么因为lua的foreach肯定也是一个语法糖,所以这个迭代器函数是给系统调用的。
具体调用过程,系统在一个循环中调用你提供的迭代器函数,将table作为参数传入,直到迭代器函数返回null为止。
这个语法糖最后展开应该类似下面的形式
--如有错误可以指出
table={1,2,3}
while true do
v=values(table)
if v==nil then
break
else
print(v)
end
end