7.1 迭代器与closure
funtction values (t)
local i = 0
return function ()
i = i + 1
return t[i]
end
end
每调用这个函数的时候就创建一个新的closure
这个closure 将它的状态保存在其外部变量 t 和 i 中。
t = { 10 ,20 , 30 }
iter = values(t)
while true do
local element = iter()
if element == nil then
break
end
print(element)
end
t = { 10 ,20 , 30 }
for element in values(t) do
print(element)
end
泛型 for 在内部保存了迭代器函数,因此不再需要 iter变量。它在每次新的迭代时调用迭代器, 并在迭代器返回nil 时结束循环。
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
1 local function iter(a, i)
2 i = i + 1
3 local v = a[i]
4 if v then
5 return i, v
6 else
7 return nil, nil
8 end
9 end
10
11 function ipairs2(a)
12 return iter,a,0
13 end
14
15 a = {"one","two","three"}
16 do
17 local _it,_s,_var = ipairs2(a)
18 while true do
19 local var_1,var_2 = _it(_s,_var)
20 _var = var_1
21 if _var == nil then --注意,这里只判断迭代器函数返回的第一个是否为nil。
22 break
23 end
24 print(var_1,var_2)
25 end
26 end
7.3 无状态的迭代器
a = { "one", "two" , "three"}
for i,v in ipairs(a) do
print(i,v)
end