迭代器: 是一种可以遍历一种集合所有元素的机制。 Lua使用函数实现。
每个迭代器都需要在每次成功调用之间保持一些状态。
一个closure结构通常涉及到两个函数:
closure本身 和 一个用于创建该 closure的工厂函数。
function values(t)
local i = 0
return function() i = i + 1; return t[i] end
end
t = { 10, 20, 30 }
iter = values(t)
while true do
local element = iter()
if element == nil then break end
print(element)
end
进化泛型for:
for element in values(t) do
print (element)
end
语法: for var1, ..., varn in <explist> do <block> end
for的第一件事是对in 后面的表达式求值, 这些表达式应该返回3个值供for保存:
迭代器函数,恒定状态和控制变量的初值 , for会以恒定状态和控制变量来调用迭代器函数。
等价于:
do
local _f, _s, _var = <explist>
while true do
local var1, ..., varn = _f(_s, _var)
_var = var1
if _var == nil then break end
<block>
end
end
无状态的迭代起 :ipairs
local function iter (a, i)
i = i + 1
local v = a[i]
if v then
return i, v
end
end
function ipairs (a)
return iter, a, 0 // 恒定状态a , 控制变量的初值0
end
a = { "one", "two", "three" }
for i, v in iparis(a) do
print(i, v)
end
调用iter(a, 0) 得到 1,a[1] , 继续调用 iter[a, 1]得到 2,a[2]
迭代器更好的名称:生成器
每个迭代器都需要在每次成功调用之间保持一些状态。
一个closure结构通常涉及到两个函数:
closure本身 和 一个用于创建该 closure的工厂函数。
function values(t)
local i = 0
return function() i = i + 1; return t[i] end
end
t = { 10, 20, 30 }
iter = values(t)
while true do
local element = iter()
if element == nil then break end
print(element)
end
进化泛型for:
for element in values(t) do
print (element)
end
语法: for var1, ..., varn in <explist> do <block> end
for的第一件事是对in 后面的表达式求值, 这些表达式应该返回3个值供for保存:
迭代器函数,恒定状态和控制变量的初值 , for会以恒定状态和控制变量来调用迭代器函数。
等价于:
do
local _f, _s, _var = <explist>
while true do
local var1, ..., varn = _f(_s, _var)
_var = var1
if _var == nil then break end
<block>
end
end
无状态的迭代起 :ipairs
local function iter (a, i)
i = i + 1
local v = a[i]
if v then
return i, v
end
end
function ipairs (a)
return iter, a, 0 // 恒定状态a , 控制变量的初值0
end
a = { "one", "two", "three" }
for i, v in iparis(a) do
print(i, v)
end
调用iter(a, 0) 得到 1,a[1] , 继续调用 iter[a, 1]得到 2,a[2]
迭代器更好的名称:生成器