版权声明: https://blog.csdn.net/qq_28710983/article/details/82943776
无状态的迭代器(不使用闭包方式),
ipairs函数
a = {10,20,30,40,50,60}
for k,v in ipairs(a) do
print(k,v);
end
-----------------------------
output:
1 10
2 20
3 30
4 40
5 50
6 60
无状态迭代器实现
function square(mx, idx)
if idx < mx then
idx = idx + 1;
return idx, idx * idx;
end
end
for i,n in square,3,0 do
print(i,n);
end
------------------------------------------
output:
1 1
2 4
3 9
for end循环原型是这样的
do
local _f, _s, _v = square,3,0
while true do
local k,v = _f(_s,_v);
_v = k;
if k == nil then break; end
print(k,v);
end
end
上面for如何把square,3,0变换成ipairs(3)这种类型
function square(mx, idx)
if idx < mx then
idx = idx + 1;
return idx, idx * idx;
end
end
function squareX(n)
return square,n,0
end
for i,n in squareX(3) do
print(i,n);
end
------------------------------------
output:
1 1
2 4
3 9
案例二、打印table数据(有状态迭代器实现,使用闭包)
arr = {"hello","lua","fangfang"};
function traverse(arr)
local idx = 0;
local count = #arr;
return function (...)
idx = idx + 1;
if idx <= count then
return idx,arr[idx];
end
end
end
for k,v in traverse(arr) do
print(k,v);
end
-----------------------
output:
1 hello
2 lua
3 fangfang
无状态迭代器实现(不使用闭包)
arr = {"hello","lua","fangfang"};
function iterator(arr,idx)
idx = idx + 1;
if idx <= #arr then
return idx,arr[idx];
end
end
function traverse(arr)
return iterator,arr,0;
end
for k,v in traverse(arr) do
print(k,v);
end
---------------------------------------------
output:
1 hello
2 lua
3 fangfang
案例三、有状态迭代器
arr = {10, 20, 30, 80, 40, 50, 60};
function myItr(arr)
local i = 0;
return function()
i = i + 1;
if arr[i] then
return i,arr[i];
end
end
end
for k,v in myItr(arr) do
print(k,v);
end
---------------------------------------
output:
1 10
2 20
3 30
4 80
5 40
6 50
7 60
原型
do
local _f, _s, _v = myItr(arr);
while true do
local k,v = _f(_s,_v);
_v = k;
if k == nil then break; end
print(k,v);
end
end
--------------------------------------
output:
1 10
2 20
3 30
4 80
5 40
6 50
7 60