当前位置: 首页 > article >正文

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

范型for

范型for的格式如下所示:

for <var-list> in <exp-list> do
    <body> 
end

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

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形式则如下:

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实现

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

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

相当于是以下代码结构:

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方法:

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
]]--


http://www.kler.cn/a/231578.html

相关文章:

  • 2. kafka 生产者
  • SDF,一个从1978年运行至今的公共Unix Shell
  • 【深度学习】使用硬件加速模型训练速度
  • 帧中继原理与配置
  • 黑马智慧商城项目学习笔记
  • 基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题
  • 从零开始手写mmo游戏从框架到爆炸(十一)— 注册与登录
  • Vuex介绍和使用
  • idea修改项目git地址
  • vue3:28— Vue 2 对 Vue 3 的所有非兼容性改变。(vue3学习笔记终)
  • 目标检测:2如何生成自己的数据集
  • MySQL重要进程
  • YOLOv7独家原创改进:大核卷积涨点系列| Shift-ConvNets,稀疏/移位操作让小卷积核也能达到大卷积核效果 | 2024年最新论文
  • 探讨CSDN等级制度:博客等级、原力等级、创作者等级
  • IntelliJ IDEA 2023.3发布,AI 助手出世,新特性杀麻了!!
  • 微软.NET6开发的C#特性——接口和属性
  • Nexus3之在Window中搭建Maven私服
  • vue3学习——自定义插件,注册组件(引入vue文件报红线)
  • 伯克利研究院推出Ghostbuster用于检测由LLM代笔的文本
  • 计算机网络——01什么是InterNet
  • 【知识整理】管理即服务,识人、识己
  • Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件
  • C语言之喝汽水问题
  • 【ASP.NET Core 基础知识】--前端开发--使用ASP.NET Core和JavaScript进行通信
  • Hadoop搭建(完全分布式)
  • PKI - 03 密钥管理(如何进行安全的公钥交换)