lua积累
--自己实现迭代器
function get_each_fun(array)
local i=0
local length=table.getn(array);
return function()
i=i+1;
return (i>length and nil) or array[i];
end
end
list={1,3,5,7,9}
for item in get_each_fun(list) do
print(item)
end
print '-----------------------------------------------------'
for item in get_each_fun(list) do
print(item)
end
function get_each_fun(array)
local i=0
local length=table.getn(array);
return function()
i=i+1;
return (i>length and nil) or array[i];
end
end
list={1,3,5,7,9}
for item in get_each_fun(list) do
print(item)
end
print '-----------------------------------------------------'
for item in get_each_fun(list) do
print(item)
end
--自己实现迭代器
function get_each_fun(array)
local i=0
local length=table.getn(array);
return function()
i=i+1;
if i>length then
return nil;
else
return i,array[i];
end
end
end
list={1,3,5,7,9}
for key,item in get_each_fun(list) do
print(key,item)
end
print '-----------------------------------------------------'
for key,item in get_each_fun(list) do
print(key,item)
end
function get_each_fun(array)
local i=0
local length=table.getn(array);
return function()
i=i+1;
if i>length then
return nil;
else
return i,array[i];
end
end
end
list={1,3,5,7,9}
for key,item in get_each_fun(list) do
print(key,item)
end
print '-----------------------------------------------------'
for key,item in get_each_fun(list) do
print(key,item)
end
范型for 的语义如下:
范性for的执行过程:
首先,初始化,计算in后面表达式的值,表达式应该返回范性for需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用nil补足,多出部分会被忽略。
第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于for结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
第三,将迭代函数返回的值赋给变量列表。
第四,如果返回的第一个值为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
语义实例:
function get_each_fun(array)
local i=0
local length=table.getn(array);
return function(s,var)
print(s,var)
i=i+1;
if i>length then
return nil;
else
return i,array[i];
end
end,99,101
end
list={1,3,5,7,9}
for key,item in get_each_fun(list) do
end
local i=0
local length=table.getn(array);
return function(s,var)
print(s,var)
i=i+1;
if i>length then
return nil;
else
return i,array[i];
end
end,99,101
end
list={1,3,5,7,9}
for key,item in get_each_fun(list) do
end