Lua迭代器以及各种源函数的实现

范型for

范型for的格式如下所示:

Lua 复制代码
for <var-list> in <exp-list> do
    <body> 
end

var-list指变量名列表,可以为多个,exp-list指表达式列表,通常情况下只有一个值。可以更具体地写为另一种形式:

Lua 复制代码
for var_1, ..., var_n in explist(s) do block end

例如代码块中常见的for k,v in pairs(tb) do end或者for k,v in ipairs(tb) do end,都是这种范型形式,如若转换成while形式则如下:

Lua 复制代码
local func = explist
local s
while true do
    local var_1, ..., var_n = func(s)
    if var_1 == nil then
        break
    end
    block
end

源函数iter、ipairs、pairs实现

可以随意写一个简单的迭代器循环:

Lua 复制代码
function iter(a)
    local i = 0
    return function()
        i = i + 1
        return a[i]
    end
end

for n in iter({1,2,3}) do
    print(n) -- 1  2  3
end

相当于是以下代码结构:

Lua 复制代码
local iterator = iter({1,2,3})
local n = iterator()
while n do
    print(n)
    n = iterator()
end

ipairs函数只不过是上面iter内部的return a[i]改为return i,a[i]罢了。

pairs函数则是用到了next方法:

Lua 复制代码
function pairsMySelf(a)
    local key,value = next(a)
    return function()
        local oldKey,oldValue = key,value
        if value ~= nil then
            key,value = next(a,key)
        end
        return oldKey,oldValue
    end
end

local tb = {
    ["a"] = 1,
    ["b"] = 1,
    ["c"] = 1,
}
for k,v in pairsMySelf(tb) do
    print(k,v)
end
--[[print:
            a       1
            b       1
            c       1
]]--
相关推荐
楼田莉子17 分钟前
C++学习:C++11关于类型的处理
开发语言·c++·后端·学习
凤山老林1 小时前
SpringBoot 如何实现零拷贝:深度解析零拷贝技术
java·linux·开发语言·arm开发·spring boot·后端
黄毛火烧雪下1 小时前
ruby 、gem 和 cocoapods的联系与区别
开发语言·ruby·cocoapods
盼哥PyAI实验室1 小时前
Python函数进阶秘籍:闭包、装饰器与作用域全解析(通俗版)
开发语言·python
oceanstonetree1 小时前
用cosyvoice批量把生成有声书
开发语言·python
半夏知半秋1 小时前
游戏登录方案中常见的设计模式整理
服务器·开发语言·笔记·学习·游戏·设计模式·lua
云知谷2 小时前
【经典书籍】C++ Primer 第14类虚函数与多态精华讲解
c语言·开发语言·c++·软件工程·团队开发
W.Buffer2 小时前
Java并发工具类详解:Semaphore、CyclicBarrier与CountDownLatch
java·开发语言
麦麦鸡腿堡2 小时前
Java的抽象类
java·开发语言
人间乄惊鸿客2 小时前
python-day8
开发语言·python