迭代器与泛型for


闭包函数创建迭代器

do
    t = {22,33,44,55,66,}     -- 待遍历的集合
    for k, v in ipairs (t) do -- 使用ipairs遍历
        print (k, v)
    end

    function tableV (t) -- 创建一个迭代器
        local i=0       -- 闭包计数器
        return function () i=i+1 return t[i] end -- 闭包函数,返回形参t表索引i的值
    end

    for v in tableV (t) do -- 测试迭代器
        print (v)
    end
end

--[[
ipairs输出     tableV输出 1 22      22 2 33      33 3 44      44 4 55      55 5 66      66
--
]]

每一次调用闭包函数都可以持续更新其保存的状态,使用这种特性就可以创建迭代器。

闭包:就是一个可以访问其自身环境中一个或多个局部变量的函数。

迭代器:是一种可以遍历一个集合中所有元素的代码结构,通常是一个函数。每次调用该函数时会返回集合中的下一个元素。

泛型for的语法

for var-list in exp-list do

  body

end

var-list:变量列表

exp-list:表达式列表,通常是一个迭代函数的调用,一个不可变受保护的数据,一个控制变量。

泛型for表达式列表中的三个值,即:迭代函数、受保护数据、控制变量。 他们要么在表达式中返回,要么在表达式列表中。在循环之前进行隐式多重赋值。

详解泛型for

do
    local t = {22,33,44,55,66,77,88}

    function tableV (t) -- 创建一个迭代器
        local i=0       -- 闭包计数器
        return function () i=i+1 return t[i] end -- 闭包函数,返回形参t表索引i的值
    end

    -- 分解泛型for
    local _f, _s, _var = tableV (t)   -- 循环之前对表达式tableV(t)求值然后进行多重赋值,_f:迭代函数,_s:受保护数据,_var:控制变量。
    while true do                     -- _f, _s, _var是从哪里来的?实际上就是LUA规定一个标准迭代函数在泛型for中的三个返回值。
        local k = _f(_s, _var)        -- 用受保护数据和控制变量作为参数调用迭代函数并与变量列表进行多重赋值,根据函数原型,结果肯定是返回t[i]
        _var = k                      -- 将控制变量赋值
        if _var == nil then break end -- 检查控制变量,如果为nil则退出循环完成迭代。
        print (_var)
    end
end