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

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 dolocal var_1, ..., var_n = func(s)if var_1 == nil thenbreakendblock
end

源函数iter、ipairs、pairs实现

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

function iter(a)local i = 0return function()i = i + 1return a[i]end
endfor n in iter({1,2,3}) doprint(n) -- 1  2  3
end

相当于是以下代码结构:

local iterator = iter({1,2,3})
local n = iterator()
while n doprint(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,valueif value ~= nil thenkey,value = next(a,key)endreturn oldKey,oldValueend
endlocal tb = {["a"] = 1,["b"] = 1,["c"] = 1,
}
for k,v in pairsMySelf(tb) doprint(k,v)
end
--[[print:a       1b       1c       1
]]--

http://www.lryc.cn/news/296262.html

相关文章:

  • e5 服务器具备哪些性能特点?
  • 《C++ Primer Plus》《2、开始学习C++》
  • Backtrader 文档学习- Sizers
  • 基于YOLOv8算法的照片角度分类项目实践
  • go语言进阶篇——面向对象(一)
  • C#,栅栏油漆算法(Painting Fence Algorithm)的源代码
  • java_error_in_pycharm.hprof文件是什么?能删除吗?
  • LeetCode 491 递增序列
  • 考研/计算机二级数据结构刷题之顺序表
  • Git 代码协同的使用方法 for Azure DevOps
  • 数据库学习笔记2024/2/5
  • PSM-Net根据Stereo图像生成depth图像
  • Mocaverse NFT 概览与数据分析
  • SpringBoot之事务源码解析
  • FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持
  • 基于高通滤波器的ECG信号滤波及心率统计matlab仿真
  • springCould中的gateway-从小白开始【9】
  • 邮箱营销软件推荐?企业邮箱群发会限制吗?
  • 编译原理实验3——自下而上的SLR1语法分析实现(包含画DFA转换图、建表、查表)
  • 基于tomcat的https(ssl)双向认证
  • 【iOS ARKit】3D人体姿态估计实例
  • ROS2 CMakeLists.txt 和 package.xml
  • 代码献瑞,算力有礼!低代码开发工具PaddleX特色产线新春福利来啦
  • C语言:操作符详解
  • Rust 初体验2
  • vue-cil的watch函数详解
  • 堆排及时间复杂度分析
  • 数据结构:双向链表
  • 51单片机之数码管显示表白数字篇
  • 代码随想录算法训练营DAY16 | 二叉树 (3)