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

rust语言学习笔记Trait(七) IntoIterator(由集合创建迭代器)

IntoIterator是 Rust迭代器的‌入口 trait。它的核心职责是将一个类型如集合、数组等转换为一个实现了Iteratortrait 的迭代器对象。任何实现了IntoIterator的类型都可以直接在for循环中使用‌。1、核心定义pubtraitIntoIterator{/// 迭代器产生的元素类型typeItem;/// 具体的迭代器类型必须实现 IteratorItem Self::ItemtypeIntoIter:IteratorItemSelf::Item;/// 消耗 self创建并返回迭代器fninto_iter(self)-Self::IntoIter;}**Item**‌: 定义迭代过程中产生的每个元素的类型。‌**IntoIter**‌: 定义实际执行迭代逻辑的类型。‌**into_iter(self)**‌: 这是转换的核心。注意它接收self按值传递这意味着调用该方法通常会消耗原始数据的所有权或者借用取决于具体实现。2、三种迭代模式的所有权1消费所有权 (impl IntoIterator for VecT)for item in vec或vec.into_iter()letv1vec![1,2,3,4];foriinv1{// 消费所有权println!({},i);}println!({:?},v1);// ❌已被移动letv2vec![1,2,3,4];foriinv2.into_iter(){// 消费所有权println!({},i);}println!({:?},v2);// ❌已被移动2不可变借用 (impla, T IntoIterator for a VecT)for item in vec或(vec).into_iter()letv1vec![1,2,3,4];foriinv1{// 不可变借用println!({},i);}println!({:?},v1);// ✅正常输出letv2vec![1,2,3,4];foriin(v2).into_iter(){// 不可变借用println!({},i);}println!({:?},v2);// ✅正常输出3可变借用 (impla, T IntoIterator for a mut VecT)for item in mut vec或(mut vec).into_iter()letmutv1vec![1,2,3,4];foriinmutv1{// 可变借用*i2;}println!({:?},v1);// 已被修改letmutv2vec![1,2,3,4];foriin(mutv2).into_iter(){// 可变借用*i-2;}println!({:?},v2);// 已被修改3、函数参数约束IntoIterator函数参数必须满足任何可迭代内容usestd::fmt::{Debug,Display};fnmy_fnI,T(v:I)whereI:IntoIteratorItemT,// 参数必须实现了 IntoIteratorT:Display,// 用于 print 输出{foriinv{// 遍历迭代器print!({} ,i);}println!();}fnmain(){my_fn(vec![1,2,3]);// Veci32my_fn([1,2,3,4]);// [i32]my_fn((5..9));// range(i32)my_fn([aaa,bbb,ccc]);// [str]}4、自定义类型实现IntoIterator#[derive(Debug)]structMyListT(VecT);// 自定义集合// 实现消费所有权的 IntoIteratorimplTIntoIteratorforMyListT{typeItemT;typeIntoIterstd::vec::IntoIterT;fninto_iter(self)-Self::IntoIter{self.0.into_iter()}}// 实现不可变引用借用的 IntoIteratorimpla,TIntoIteratorforaMyListT{typeItemaT;typeIntoIterstd::slice::Itera,T;fninto_iter(self)-Self::IntoIter{self.0.iter()}}// 实现可变引用借用的 IntoIteratorimpla,TIntoIteratorforamutMyListT{typeItemamutT;typeIntoIterstd::slice::IterMuta,T;fninto_iter(self)-Self::IntoIter{self.0.iter_mut()}}fnmain(){// 消费所有权letlist1MyList(vec![1,2,3]);foriteminlist1{println!({},item);}// 不可变借用letlist2MyList(vec![4,5,6]);foriteminlist2{println!({},item);}// 可变借用letmutlist3MyList(vec![4,5,6]);foriteminmutlist3{*item10;}println!({:?},list3);}
http://www.zskr.cn/news/1334809.html

相关文章:

  • 2026年移动广告联盟TOP5盘点:APP变现、APP商业化变现、APP广告收益提升、APP广告素材合规、APP想接入广告选择指南 - 优质品牌商家
  • 2026年q2物业托管技术全解析:成都清洁外包/成都物业公司/成都物业外包/攀枝花保洁公司/选型与落地核心推荐 - 优质品牌商家
  • 电动汽车创企Fisker破产后,4000名车主自发组建开源汽车公司延续车辆生命。
  • 给 AI 写一份老厨师的菜谱:从传统文档到 Skill 知识体系
  • 终极指南:使用Play Integrity API Checker保护你的Android应用安全
  • Linux信号机制深度解析:从内核实现到多线程编程实践
  • DeepSeek RAG场景GPU资源黑洞:向量检索+重排序+生成三阶段显存泄漏的48小时定位实录(含perf脚本)
  • [qemu+kvm]: iommu 开关代码分析
  • 百度 Agent 安全中心:构筑企业智能体的安全底座
  • 某消费电子终端上市公司实例:德思特衰减器方案以1/3成本精准复现弱网与WiFi干扰场景
  • 别只当题做!我把CTFshow Web信息搜集题(11-20)变成了真实漏洞挖掘指南
  • 数据架构演进:从数据仓库到湖仓一体与流批融合实战
  • 2026年六大主流AI变声器软件排名推荐!
  • 从STM32F405到AT32F435:手把手教你给AocodaRC飞控换‘芯’并刷入BetaFlight固件
  • 极化激元量子流体:从Bogoliubov色散到引力模拟的精密探测
  • 武汉假发店TOP5评测|专业形象美学指南,揭秘头部信赖之选! - 行业深度观察C
  • 高频电路五大典型故障现象、根因与排查流程
  • 当 DAA 成为常态,如何用“数字摄像头”建设 Agent 可观测性
  • 魔,法变,声器,低延迟高保真设计,让语音聊天与直播互动更具趣味性与辨识度
  • 从VGG到ResNeXt:一文读懂CNN模块化设计的演进史与实战选择
  • Linux系统开机启动模式
  • 武威本地专业承接各类项目落地 本土资深班组全程施工更靠谱
  • 7分钟掌握中国行政区划数据:从零到实战的完整指南
  • 【限时解密】Perplexity未公开的历史资料检索协议v2.3:仅开放给前500名深度用户的私有搜索语法手册
  • 保姆级教程:在ArduPilot上配置RSSI,让你的无人机遥控信号一目了然
  • 工具失败处理模板 重试 退避 降级 补偿事务的统一实现
  • 告别龟速下载!用国内网盘5分钟搞定Arduino ESP32开发环境(附CH340驱动)
  • 穿云越巷的“全局视野”:NeurIPS 2026 论文深度解读《Seeing Across Skies and Streets: Feedforward 3D Reconstruction from
  • 合肥瓷砖批发TOP5全面评测|瓷砖选购避坑指南 - 行业深度观察C
  • 本科毕业论文写作破局:okbiye AI 全流程适配高校规范的实践解析