泛型for的语义
在循环中每次调用迭代器每次都要创建一个新的closure,或者在循环之前定义一个closure,这样是有些麻烦的
在泛型for内部会保存迭代器函数,这样就不会有多传造closure了
泛型for的语法如下
for <var-list> in <exp-lisr> do
<body>
end
其中, var-list 是一个或者多个变量列表,用逗号分隔开来,exp-list是一个或者多个表达式的列表,同样逗号隔开。
如
for k,v in pairs(t) do
print(l,v);
end
其中,第一个元素称呼控制变量,在循环中过程中,该值不会为nil,如果为nil了这个循环就结束了。
for做的第一件事就是对in后面的表达式求值,这些表达式返回三个值保存在for中,迭代器函数,恒定状态,控制变量的初值。
例如
function addNum(a)
local i=0;
return function ()
i=i+1;
return a[i];
end
end;
a={1,2,3,4,5};
for item in addNum(a) do
print(item);
end
在这个例子中,形参a是恒定状态,控制变量初值是item,迭代器函数是 addNum
直到item的值为nil则循环结束
无状态的迭代器
如字面的意思,迭代器本身不保存任何状态,如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
end
a={"one","two","three"};
for i,v in ipairs(a) do
print(i,v);
end
可以看出,实际上iter中的v值没有保存任何状态;
变量控制变量是从外部传入的而非内部构造的
复杂状态的迭代器
在实际应用中,迭代器需要保存许多的状态,但是泛型for却只提供一个恒定状态和控制变量用于保存状态
这时将需要的状态保存在table或者closure中的话,那么存储需要的状态了
//看的还是有点蒙圈