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

Lua(迭代器)

Lua 迭代器基础概念

Lua 迭代器是一种允许遍历集合(如数组、表)元素的机制。迭代器通常由两个部分组成:迭代函数和状态控制变量。每次调用迭代函数会返回集合中的下一个元素。

泛型 for 循环

Lua 提供了泛型 for 循环来简化迭代器的使用。语法如下:

for var1, var2, ..., varN in iterator_function, state, initial_value do-- 循环体
end

  • iterator_function:迭代函数,每次调用返回下一个值。
  • state:迭代器的状态(通常是集合本身)。
  • initial_value:迭代的初始值(通常为 nil)。

无状态迭代器

无状态迭代器不保留任何状态信息,状态完全由外部控制。典型的例子是 ipairspairs

warring:

同:都是能遍历集合(表、数组)

异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。

pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。

示例:实现类似 ipairs 的迭代器

local function iter(t, i)i = i + 1if t[i] thenreturn i, t[i]end
endfunction my_ipairs(t)return iter, t, 0
end-- 使用
local arr = {10, 20, 30}
for i, v in my_ipairs(arr) doprint(i, v)
end

有状态迭代器

有状态迭代器将状态封装在闭包或表中,无需外部传递状态。

闭包实现

function my_iter(t)local i = 0return function()i = i + 1if t[i] thenreturn i, t[i]endend
end-- 使用
local arr = {10, 20, 30}
for i, v in my_iter(arr) doprint(i, v)
end

表实现

local iterator = {}
iterator.__index = iteratorfunction iterator.new(t)return setmetatable({t = t, i = 0}, iterator)
endfunction iterator:__call()self.i = self.i + 1if self.t[self.i] thenreturn self.i, self.t[self.i]end
end-- 使用
local arr = {10, 20, 30}
for i, v in iterator.new(arr) doprint(i, v)
end

自定义迭代器

通过实现 __pairs__ipairs 元方法,可以自定义表的迭代行为。

示例:逆序遍历数组

local function reverse_iter(t, i)i = i - 1if i > 0 thenreturn i, t[i]end
endfunction reverse_ipairs(t)return reverse_iter, t, #t + 1
end-- 使用
local arr = {10, 20, 30}
for i, v in reverse_ipairs(arr) doprint(i, v)
end

协程迭代器

协程可以用于实现复杂的迭代逻辑,尤其是需要跨多次调用维护状态的情况。

示例:遍历二叉树

local function traverse(node)if not node then return endtraverse(node.left)coroutine.yield(node.value)traverse(node.right)
endfunction tree_iter(root)return coroutine.wrap(function()traverse(root)end)
end-- 使用
local tree = {value = 2,left = {value = 1},right = {value = 3}
}
for v in tree_iter(tree) doprint(v) -- 输出 1, 2, 3
end

性能优化建议

  1. 无状态迭代器通常比有状态迭代器更快,因为避免了闭包创建的开销。
  2. 对于大规模数据,优先使用 ipairspairs 而不是自定义迭代器。
  3. 协程迭代器虽然灵活,但会有额外的协程调度开销。
http://www.xdnf.cn/news/16148.html

相关文章:

  • 现代C++的一般编程规范
  • 论文阅读:《针对多目标优化和应用的 NSGA-II 综述》一些关于优化算法的简介
  • Python生成折线图
  • 二、计算机网络技术——第6章:应用层
  • matrix-breakout-2-morpheus靶场通过
  • 详解FreeRTOS开发过程(五)-- 系统内核控制函数及任务相关API函数
  • 低功耗设计双目协同画面实现光学变焦内带AI模型
  • vs调试C++,无法显示长字符串所有内容
  • 上证50ETF期权的交易时间是什么时候?
  • 模块化商城的快速部署之道:ZKmall开源商城如何让电商功能即插即用
  • rustfs/rustfs基于 Rust 的高性能分布式存储系统
  • 多模态数据处理系统:用AI读PDF的智能助手系统分析
  • 物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践
  • EVAL长度限制突破方法
  • java实体类常规校验(字符串不包含空格)
  • mac电脑(m1) - flask断点失效
  • 2025年区块链安全威胁全景:新兴漏洞、攻击向量与防护策略深度解析
  • 【数据结构初阶】--二叉树(二)
  • SAP-MM-采购订单批量创建 excel 版
  • MYOJ_10583:CSP初赛题单7:计算机常识综合练习
  • 人工智能与云计算双轮驱动:元宇宙如何重构全球产业生态
  • linux入门 相关linux系统操作命令(二)--文件管理系统 ubuntu22.04
  • Windows本地部署DeepSeek
  • Leetcode力扣解题记录--第2题(加法模拟)
  • 量子威胁下的区块链进化:后量子密码学时代的分布式账本革命
  • 从手动操作到自动化:火语言 RPA 在多系统协作中的实践
  • Elasticsearch 高级查询语法 Query DSL 实战指南
  • C#_定时器_解析
  • 光猫配置DMZ到路由器
  • 20-ospf技术