LUA 迭代器与泛型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 -- 返回了一个匿名函数的地址,这个匿名函数返回迭代后的键。
    end

    -- 分解泛型for
    local _f, _s, _var = tableV (t)   -- 多重赋值,_f:迭代函数,_s:受保护数据,_var:控制变量。_f引用了tableV(t)返回的匿名函数
    while true do                     -- 泛型for希望一个迭代器函数能够返为他反回三个值,_f, _s, _var。这样才能在迭代中使用闭包进行计数器叠加,不破坏被迭代的数据,判断迭代结束。
        local k = _f(_s, _var)        -- 用受保护数据和控制变量作为参数调用迭代函数并与变量列表进行多重赋值,根据函数原型,k赋值肯定是每次迭代最新的t[i]键
        _var = k                      -- 将控制变量赋值
        if _var == nil then break end -- 检查控制变量,如果为nil则退出循环完成迭代。
        print (_var)
    end
end
复制代码

 

posted @   黑姆豆  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示