csdn学习笔记一:lua 迭代器

版权声明: 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

猜你喜欢

转载自blog.csdn.net/qq_28710983/article/details/82943776