Rust自定义迭代器

news/2025/12/1 15:32:38/文章来源:https://www.cnblogs.com/baiyutang7/p/19292969

Rust自定义迭代器

Rust要自定迭代器要实现Iterator这个Trait,就可以使用next方法,也可以实现IntoIterator方法就可以把对象转换为一个迭代器。这与Python中的可迭代对象和迭代器的概念类似。在Python中,实现了__iter__方法就是一个可迭代对象,再实现__next__方法就是一个迭代器。
Python的迭代器和可迭代对象

Iterator定义

pub trait Iterator{type Item;fn next(&mut self) -> Option<Self::Item>;
}

实现了Iterator的对象就是一个迭代器类型

IntoIterator

实现了IntoIterator就可以使用for in循环了

pub trait IntoIterator {type Item;type IntoIter: Iterator<Item=Self::Item>;fn into_iter(self) -> Self::IntoIter;
}// 实现了Iterator可以自动实现IntoIterator
impl<I: Iterator> IntoIterator for I {type Item = I::Item;type IntoIter = I;#[inline]fn into_iter(self) -> I {self}
}

示例


struct Node<T> {value: T,next: Option<Box<Node<T>>>
}struct LinkedList<T> {head: Option<Box<Node<T>>>,length: usize
}impl <T> Node<T> {fn new(value: T) -> Self {Node { value, next: None }}
}impl <T> LinkedList<T> {fn new() -> Self {LinkedList { head: None, length: 0 }}fn push_front(&mut self, value: T) {let new_node = Box::new(Node{value, next: self.head.take()});self.head = Some(new_node);self.length += 1;}fn pop_front(&mut self) -> Option<T> {self.head.take().map(|node| {self.head = node.next;self.length -= 1;node.value})}fn peek(&self) -> Option<&T> {self.head.as_ref().map(|node| {&node.value})}fn len(&self) -> &usize {&self.length}fn is_empty(&self) -> bool {*self.len() == 0}fn contains(&self, value: T) -> bool where T: PartialEq{let mut current = &self.head;while let Some(node) = current {if node.value == value {return true;}current = &node.next;}false}fn reverse(&mut self) {let mut prev = None;let mut current = self.head.take();while let Some(mut node) = current {let next = node.next.take();node.next = prev;prev = Some(node);current = next;}self.head = prev;}fn clear(&mut self) {self.length = 0;self.head = None;}fn reverse_recursive(&mut self) {fn recusive<T> (head: Option<Box<Node<T>>>, pre: Option<Box<Node<T>>>) -> Option<Box<Node<T>>> {if head.is_none() {return pre;}let mut cur = head.unwrap();let next: Option<Box<Node<T>>>  = cur.next.take();cur.next = pre;recusive(next, Some(cur))}self.head = recusive(self.head.take(), None);}fn reverse_recursive2(&mut self) {fn recusive<T> (head: Option<Box<Node<T>>>, pre: Option<Box<Node<T>>>) -> Option<Box<Node<T>>> {match head {Some(mut node) => {let next = node.next.take();node.next = pre;recusive(next, Some(node))},None => pre}}}}struct IntoIter<T> {list: LinkedList<T>
}struct Iter<'a, T> {next: Option<&'a Node<T>>
}struct IterMut<'a, T> {next: Option<&'a mut Node<T>>
}impl<T> Iterator for IntoIter<T> {type Item = T;fn next(&mut self) -> Option<Self::Item> {self.list.pop_front()}}impl<T> IntoIterator for LinkedList<T> {type Item = T;type IntoIter = IntoIter<T>;fn into_iter(self) -> Self::IntoIter {IntoIter {list: self}}}impl <'a, T> Iterator for Iter<'a, T> {type Item = &'a T;fn next(&mut self) -> Option<Self::Item> {self.next.map(|node| {self.next = node.next.as_deref();&node.value})}
}impl<T> LinkedList<T> {pub fn iter(&self) -> Iter<'_, T> {Iter { next: self.head.as_deref() }}
}impl<'a, T> Iterator for IterMut<'a, T> {type Item = &'a mut T;fn next(&mut self) -> Option<Self::Item> {self.next.take().map(|node| {self.next = node.next.as_deref_mut();&mut node.value})}
}impl<T> LinkedList<T> {pub fn iter_mut(&mut self) ->IterMut<'_, T> {IterMut { next: self.head.as_deref_mut() }}
}fn main() {let mut list = LinkedList::new();list.push_front(1);list.push_front(2);list.push_front(3);assert_eq!(list.pop_front(), Some(3));assert_eq!(list.pop_front(), Some(2));assert_eq!(list.pop_front(), Some(1));assert_eq!(list.pop_front(), None);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/983054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适合幼儿园开展的STEM课程品牌介绍及分析

在当前以科技教育为主的大环境,幼儿园如何开展STEM教育,哪个课程品牌更容易落地,风险更小呢? 在教育部等七部门发布《关于加强中小学科技教育的意见》的大背景,很多人在思考:在幼儿园阶段引入STEM教育(科学、技…

分库分表全面总结

目录分库分表全面总结分库分表的本质分库分表方式示例1:垂直分库(按业务拆分到不同数据库)示例2:垂直分表(按列拆分到不同表)示例3:水平分库(数据分布到不同数据库的同名表)示例4:水平分表(数据分布到同库的…

2025年深圳品牌策划公司推荐排行榜:深圳品牌策划公司能整合

在企业品牌竞争白热化的当下,选择一家能整合资源、提供稳定优质服务的深圳品牌策划公司,成为众多企业突破增长瓶颈的关键。为帮助企业精准选型,我们从资源整合能力、服务稳定性、服务质量、客户口碑及案例落地效果五…

2025年中国十大网店代运营公司推荐:代运营哪家强?

本榜单依托产业带深度调研与工厂真实合作口碑,聚焦源头厂商电商痛点,筛选出十家能解决招人难、成本高、效果差的标杆代运营企业,为实体厂商选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:广东飞客网…

2025年户外橡胶地垫制造厂权威推荐榜单:减震橡胶地垫/公园橡胶地垫/复合橡胶地垫源头厂家精选

户外橡胶地垫作为公共空间安全防护与运动场地建设的重要材料,其市场需求持续增长。据行业统计,我国户外橡胶地垫市场规模年均增长率达12%以上,其中厚度20mm以上的高规格产品占比超过40%。本文基于产品质量、市场覆盖…

靠谱的国际短信验证码平台,短信验证码服务商盘点,兼顾速度、安全与成本控制!

在全球化日益加深的今天,国际短信验证码服务已成为企业拓展海外市场、提升用户体验的关键环节。从跨境电商到金融科技,从游戏出海到远程办公,高效、稳定、安全的短信验证码平台成为企业不可或缺的合作伙伴。根据QYR…

【JPCS出版 | EI检索】第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2025)

第七届机械工程与自动化国际学术会议(MEA 2025)将于2025年12月19日至21日在中国广州举行。【往届见刊后快至1个月检索、连续5年稳定EI检索、易中稿】 第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议…

这个代码有什么用

$ a.out test init=ok search=34/34 candidate_num=157 dec=34 py2=shijiwentiyaodaoshijicainengjiejue $ a.out read successfully, lemma num: 65101 spelling tree construct successfully. ... $ make g++ -g -…

2025年日字扣生产厂家权威推荐榜单:箱包塑料配件‌/塑料制品‌/塑胶扣具‌源头厂家精选

日字扣,虽只是箱包、户外装备上不起眼的小部件,却是决定产品使用便利性与耐用性的关键。据行业报告,2025年全球滑扣市场(包含日字扣等调节扣具)正稳健发展,其增长得益于箱包、户外及功能服装市场的持续需求。 在…

2025年磷酸铁回转窑生产厂家权威推荐榜单:回转窑干燥设备‌/磷酸铁锂回转窑‌/大豆渣回转窑干燥机‌源头厂家精选

在新能源与绿色制造浪潮推动下,回转窑作为处理磷酸铁、大豆渣等复杂物料的关键装备,其市场需求与技术迭代正同步加速。2025年,中国回转窑市场已达到19.32亿元人民币的规模,全球市场更是高达50.84亿元,且市场正持续…

JavaScript基础笔记碎片-对象、数组、Map与Set

注意:本篇学习笔记基于原网站: JavaScript教程 - 廖雪峰的官方网站 笔记仅作学习留档使用 本篇目录对象 循环 Map和Set iterable对象 let object ={...}表示一个对象,键值对 以xxx: xxx形式申明,,隔开。最后一个键…

java17版本,用IDEA开发,在JavaFX中无法找到com.google.gson。

java17版本,用IDEA开发,在JavaFX中无法找到com.google.gson。 切换版本为<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1…

2025手机配件到迪拜物流专线送仓TOP5权威推荐:甄选企业

中东跨境电商蓬勃发展,手机配件作为热门品类,年出口额超300亿元,但物流环节的痛点成为企业出海的大阻碍。据2024年行业调研,45%的手机配件出口企业因中东空运的头程延误、清关卡顿、末端派送失败,导致订单纠纷率高…

Visual Studio Code 轻量不简陋!VS Code:零基础编程者的第一款「万能编辑器」安装+中文设置步骤

简介 Visual Studio Code(简称 VS Code)是微软 2015 年 4 月在 Build 开发者大会发布的开源免费轻量级代码编辑器,它填补了普通文本编辑器和重型集成开发环境(IDE)之间的空白,如今已是全球多数开发者的首选工具,…

推荐几家海外展会推广公司,五家效果不错的海外展会营销推广平台详细介绍

随着 “一带一路” 倡议深入推进及 RCEP 区域合作深化,中国企业出海需求持续攀升。据中国会展经济研究院数据显示,2024 年中国境外自主办展总数达 216 个,增幅 13.68%,其中 78.24% 的展会布局在 “一带一路” 共建…

2025年12月AI 编程代码生成效率实战推荐:技术性能与应用场景的全面分析

在软件开发进入AI驱动的全新阶段,AI编程工具已成为提升开发者效率的核心要素。据IDC预测,2025年全球AI开发者工具和平台支出将达到224亿美元,年复合增长率高达24.8%;同时,Stack Overflow 2024年度开发者调查显示,…

开源高性能IM+集成AI能力,基于SpringBoot +Tauri+Vue 3+TypeScript支持全平台与丰富会话模式

开源高性能IM+集成AI能力,基于SpringBoot +Tauri+Vue 3+TypeScript支持全平台与丰富会话模式 天若源码教程实战2025年11月27日 07:00 湖南 点击“蓝色字”,关注我们哦!!一、平台介绍在某次兼职项目中,我受其他公司…

数字屋打包流程

打包流程 一、珍藏版打包:纸盒(外包装):打包 五件套准备工作: 向日葵+指路牌、激活卡、折光板、草地、干燥剂草地装入小袋 向日葵+指路牌贴双面贴,装入小袋 折光板贴双面贴每个产品放配件: 五件套、木底座、包黄…