第 7 章 迭代器与泛型 for

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

 
  
 
  
 
  
 
  
 
  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值