學習筆記十四——一文看懂 Rust 迭代器

🌀 一文看懂 Rust 迭代器


📚 目錄導航

  1. 什么是迭代器?為什么 Rust 到處都在用它?
  2. Rust 迭代器的底層邏輯是什么?
  3. 適配器 vs 消費者:誰是主角?
  4. 常見適配器:加工數據的全能工廠
  5. 常見消費者:迭代器的“吃貨家族”
  6. Rust 如何保證高性能?為什么懶執行這么厲害?
  7. ? 高階技巧通俗講透:by_ref、提前消費
  8. 🧠 小白也能寫的自定義迭代器:從邏輯到實戰
  9. 總結 + 常見場景整理

1?? 什么是迭代器?為什么 Rust 到處都在用它?

一句話:迭代器就是一個可以“一個個吐出值”的東西。

再通俗點:它像一個工人,負責“從集合里拿出元素”:

let v = vec![1, 2, 3];
let mut it = v.iter();println!("{:?}", it.next()); // Some(1)
println!("{:?}", it.next()); // Some(2)
println!("{:?}", it.next()); // Some(3)
println!("{:?}", it.next()); // None

每次調用 .next(),它就給你一個 Option<T> 類型的值:

  • 有值:Some(x)
  • 沒值了:None

2?? Rust 迭代器的底層邏輯是什么?

Rust 用 trait Iterator 抽象了所有“可以被一項一項訪問”的數據結構:

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

你只需要實現 next(),它會一項一項地返回數據。每個適配器、消費者,都是圍繞 next() 構建的!


3?? 適配器 vs 消費者:誰才是主角?

對比適配器(Adapter)消費者(Consumer)
功能加工、變換、組合數據真正“把數據用掉”
是否懶執行? 是? 一調用就開始運行
是否返回迭代器? 返回新的迭代器? 返回值(Vec、i32、bool)
示例.map() .filter() .take().collect() .sum() .find()

類比思路 🧠:

適配器像工廠流水線,把原料(數據)加工好,
消費者像物流運輸,把結果打包送到你手里。


4?? 常見適配器:加工數據的全能工廠

名稱用法示例通俗場景
map()加工每個元素.map(|x| x + 1)全部加 1、轉大寫等
filter()篩選元素.filter(|x| *x > 3)只要大于 3 的
take(n)只取前 n 個.take(2)分頁、限流
skip(n)跳過前 n 個.skip(2)跳過表頭等
enumerate()帶索引.enumerate()打印編號
rev()倒序.rev()倒著打印
chain()拼接a.chain(b)合并多個集合

🌰 示例:

let result: Vec<_> = (1..=5).filter(|x| x % 2 == 1).map(|x| x * 10).collect();println!("{:?}", result); // [10, 30, 50]

5?? 常見消費者:迭代器的“吃貨家族”

名稱用法示例作用
collect()收集為 Vec、HashMap 等.collect::<Vec<_>>()最常用
for_each()遍歷做事.for_each(|x| println!("{}", x))替代 for 循環
sum()求和.sum::<i32>()累加數字
product()求積.product::<i32>()全部相乘
count()個數.count()數據量統計
find()找一個滿足條件的值.find(|x| *x == 3)搜索場景
any()有一個滿足條件?.any(|x| x > 5)判斷存在性
all()全部滿足條件?.all(|x| x > 0)校驗條件

6?? Rust 如何保證高性能?為什么懶執行這么厲害?

Rust 的迭代器用的是“懶加載”思想:

💤 什么叫懶?

不會一開始就執行所有 .map().filter(),而是只有你用 collect() 等消費器,才“觸發”處理流程。

let iter = (1..=3).map(|x| {println!("處理 {}", x);x + 1
}); // 什么都不會打印let v: Vec<_> = iter.collect(); // 現在才開始打印

7?? ? 高階技巧通俗講透

? by_ref() 是啥?

你拿一個可變引用傳遞給某個適配器,就能保留迭代器狀態。

🌰 示例:我們只想用這個迭代器的一部分

let mut it = vec![1, 2, 3, 4, 5].iter();let a: Vec<_> = it.by_ref().take(2).collect(); // 拿前兩個
let b: Vec<_> = it.collect(); // 剩下的還可以繼續用println!("{:?} {:?}", a, b); // [1, 2] [3, 4, 5]

8?? 🧠 小白也能寫的自定義迭代器:從邏輯到實戰

你只要記住兩點:

? 一個迭代器必須:

  1. 有個結構體保存狀態(比如當前數)
  2. 實現 Iterator trait,提供 next() 方法

🌰 例子:自己寫一個“從 1 數到 5”的迭代器

struct CountToFive {count: usize,
}impl Iterator for CountToFive {type Item = usize;fn next(&mut self) -> Option<Self::Item> {if self.count < 5 {self.count += 1;Some(self.count)} else {None}}
}
? 用法:
fn main() {let counter = CountToFive { count: 0 };for n in counter {println!("{}", n); // 輸出 1 到 5}
}

📌 模板套路(記住就能寫):

struct MyIter { 狀態字段 }impl Iterator for MyIter {type Item = 返回的類型;fn next(&mut self) -> Option<Self::Item> {// 判斷是否結束 + 返回 Some(...) or None}
}

? 什么場景該自己寫?

  • 你要從 1 到 100,每次跳 7(非普通序列)
  • 你要包裝異步、分頁、網絡流
  • 想把某個結構變成“可遍歷”的對象

9?? 總結:迭代器能做什么?為啥這么香?

優點表現
? 安全沒有手動索引越界的煩惱
? 高性能零成本抽象,懶執行,自動內聯
? 表達力強寫起來非常流暢,讀起來像“數據管道”
? 可組合map + filter + take 無限組合
? 可擴展你可以實現自己的迭代器,復用邏輯

🚀 常見實戰場景:

  • 遍歷 Vec、HashMap、文件行
  • 過濾無效數據
  • 求和 / 聚合統計
  • 實現分頁 / 分批處理
  • 管道式業務數據處理(流式處理)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901665.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QR輕量二維碼生成系統PHP源碼

源碼介紹 基于PHP編寫的二維碼在線生成系統。只需點擊幾下就可以生成您的個人二維碼&#xff01;上傳您的徽標&#xff0c;選擇自定義顏色&#xff0c;生成多種類型。選擇一個圖案并下載最終的qrcode。可用格式&#xff1a;.png&#xff0c;.svg 效果預覽 源碼獲取 QR輕量二…

基于Spring MVC的客戶端真實IP獲取方案解析

文章目錄 基于Spring MVC的客戶端真實IP獲取方案解析概述核心方法解析代碼實現工作流程 IP獲取優先級策略IP有效性驗證異常處理與日志使用場景注意事項擴展建議 基于Spring MVC的客戶端真實IP獲取方案解析 概述 在Web應用開發中&#xff0c;準確獲取客戶端真實IP地址是常見的…

Idea集成AI:CodeGeeX開發

當入職新公司&#xff0c;或者調到新項目組進行開發時&#xff0c;需要快速熟悉項目代碼 而新的項目代碼&#xff0c;可能有很多模塊&#xff0c;很多的接口&#xff0c;很復雜的業務邏輯&#xff0c;更加有與之前自己的代碼風格不一致的現有復雜代碼 更別提很多人寫代碼不喜…

Python(18)Python中JSON的妙用:詳解序列化與反序列化原理及實戰案例

目錄 一、背景&#xff1a;為什么Python需要JSON&#xff1f;二、核心技術解析&#xff1a;序列化與反序列化2.1 核心概念2.2 類型映射對照表 三、Python操作JSON的四大核心方法3.1 基礎方法庫3.2 方法詳解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、實戰…

【物聯網】基于LORA組網的遠程環境監測系統設計

基于LORA組網的遠程環境監測系統設計 演示視頻: 簡介: 1.本系統有一個主機,兩個從機。 2.一主多從的LORA組網通信,主機和兩個從機都配備了STM32F103單片機與 LoRa 模塊,主機作為中心設備及WIFI網關,負責接收和發送數據到遠程物聯網平臺和手機APP,兩個從機則負責采集數…

通過金融科技(Fintech)掌控財務:智能理財管理指南

李升偉 編譯 在當今世界&#xff0c;科技幾乎重塑了我們生活的方方面面&#xff0c;包括金錢的管理方式。金融科技&#xff08;Fintech&#xff09;讓個人財務管理變得前所未有的便捷、高效和智能。從追蹤支出到投資理財、提升信用評分&#xff0c;金融科技工具賦予個人掌控財…

html-css樣式

1. 所有類型為文本的 元素的樣式 指定所有類型為文本的 元素的樣式 /* 文本框的樣式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的寬度 */ padding: 25px; } font-size&#xff1a;字體大小 width&#xff1a;文本框寬度 padding&#…

【C語言基礎】C++ 中的 `vector` 及其 C 語言實現詳解

一、C 中的 vector&#xff1a;動態數組的核心特性 1. 基本概念 vector 是 C 標準模板庫&#xff08;STL&#xff09;中的動態數組容器&#xff0c;支持自動擴容、高效元素訪問和豐富的操作接口。其核心特性包括&#xff1a; 動態內存管理&#xff1a;自動調整容量&#xff0…

nvm切換node版本后,解決npm找不到的問題

解決方法如下 命令行查看node版本 node -v找到node版本所對應的npm版本 點擊進入node版本 npm對應版本下載 點擊進入npm版本 下載Windows 壓縮包 下載完成后&#xff0c;解壓&#xff0c;文件改名為npm 復制到你nvm對應版本的node_modules 下面 將下載的npm /bin 目錄…

數據結構:最小生成樹的普里姆算法和克魯斯卡爾算法

對于一個帶權&#xff08;假設每條邊上的權均為大于零的實數&#xff09;連通無向圖 G 中的不同生成樹&#xff0c;其每棵樹的所有邊上的權值之和也可能不同&#xff1b;圖的所有生成樹中具有邊上的權值之和最小的樹稱為圖的最小生成樹&#xff08;Minimal Spanning Tree&#…

Information-Theoretic Limits of Bistatic Integrated Sensing and Communication

摘要 雙靜態感知指的是發射器&#xff08;照亮目標&#xff09;和感知接收器&#xff08;估計目標狀態&#xff09;在物理上分離的場景&#xff0c;這與發射和感知功能共存的單靜態感知形成對比。在實際場景中&#xff0c;雙靜態感知可能需要應對系統約束&#xff0c;或者作為…

XCTF-web(四)

unserialize3 需要反序列化一下&#xff1a;O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;} php_rce 題目提示rce漏洞&#xff0c;測試一下&#xff1a;?s/Index/\think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]1 flag&#xff1…

Java Stream深度解析 高階技巧與性能優化實戰

文章目錄 一、Stream底層機制揭秘1.1 Stream流水線架構1.2 Spliterator探秘 二、自定義收集器高級實現2.1 實現高性能統計收集器2.2 多級分組優化技巧 三、并行流深度優化3.1 并行度控制策略3.2 工作竊取(Work-Stealing)優化 四、無限流與短路操作4.1 生成無限質數流4.2 短路操…

TailwindCss快速上手

什么是Tailwind Css? 一個實用優先的 CSS 框架&#xff0c;可以直接在標記中組合以構建任何設計。 開始使用Tailwind Css 如何安裝 下面是使用vite構建工具的方法 ①安裝 Tailwind CSS: tailwindcss通過tailwindcss/vitenpm安裝。 npm install tailwindcss tailwindcss…

Web前端 (CSS篇)

什么是CSS&#xff1f; css(Cascading Style Sheets)是層疊樣式表或級聯樣式表&#xff0c;是一組設置規則&#xff0c;用于控制web頁面外觀。 為什么使用CSS? CSS 用于定義網頁的樣式&#xff0c;包括針對不同設備和屏幕尺寸的設計和布局。 CSS 實例 body {background-col…

微服務2--服務治理與服務調用

前言 &#xff1a;本文主要闡述微服務架構中的服務治理&#xff0c;以及Nacos環境搭建、服務注冊、服務調用&#xff0c;負載均衡以及Feign實現服務調用。 服務治理 服務治理是微服務架構中最核心最基本的模塊。用于實現各個微服務的自動化注冊與發現。 服務注冊&#xff1a;在…

智能麻將出牌組件

開篇引言? 麻將作為一款風靡全球的策略性游戲&#xff0c;其復雜的規則和多變的牌局給玩家帶來了無盡樂趣。在數字化時代&#xff0c;運用編程技術為麻將游戲賦予智能&#xff0c;實現自動出牌功能&#xff0c;不僅能提升玩家體驗&#xff0c;還能深入探索算法在博弈游戲中的…

“大灣區珠寶藝境花園”璀璨綻放第五屆消博會

2025年4月13日&#xff0c;第五屆中國國際消費品博覽會&#xff08;以下簡稱"消博會"&#xff09;重要主題活動——《大灣區珠寶藝境花園》啟動儀式在海南國際會展中心2號館隆重舉行。由廣東省金銀珠寶玉器業廠商會組織帶領粵港澳大灣區優秀珠寶品牌&#xff0c;以“…

基于前端技術的QR碼API開發實戰:從原理到部署

前言 QR碼&#xff08;Quick Response Code&#xff09;是一種二維碼&#xff0c;于1994年開發。它能快速存儲和識別數據&#xff0c;包含黑白方塊圖案&#xff0c;常用于掃描獲取信息。QR碼具有高容錯性和快速讀取的優點&#xff0c;廣泛應用于廣告、支付、物流等領域。通過掃…

利用耦合有限元和神經網絡計算的骨重塑模擬多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要&#xff1a;本文旨在開發一種基于有限元分析&#xff08;FEA&#xff09;和神經網絡&#xff08;NN&#xff09;計算的多尺度分層混合模型&#xf…