Rust 學習筆記:使用迭代器改進 minigrep

Rust 學習筆記:使用迭代器改進 minigrep

  • Rust 學習筆記:使用迭代器改進 minigrep
    • 不使用 clone,而使用迭代器
    • 使用迭代器適配器使代碼更清晰
    • 在循環或迭代器之間進行選擇

Rust 學習筆記:使用迭代器改進 minigrep

前情提要:https://blog.csdn.net/ProgramNovice/article/details/148192426

有了這些關于迭代器的新知識,我們可以通過使用迭代器使代碼更清晰、更簡潔。讓我們看看迭代器如何改進 Config::build 函數和 search 函數的實現。

不使用 clone,而使用迭代器

原函數:

impl Config {pub fn build(args: &[String]) -> Result<Config, &'static str> {if args.len() < 3 {return Err("not enough arguments");}let query = args[1].clone();let file_path = args[2].clone();let ignore_case = env::var("IGNORE_CASE").is_ok();Ok(Config { query, file_path, ignore_case })}
}

有了關于迭代器的新知識,我們可以修改構建函數,使其接受迭代器的所有權作為參數,將 String 值從迭代器移到 Config 中,而不是調用 clone 并進行新的分配。

env::args 函數返回一個迭代器,類型是 std::env::Args,該類型實現了 Iterator trait 并返回 String 值。

修改代碼,使得其所有權直接傳遞給 Config::build 函數。

fn main() {let config = Config::build(env::args()).unwrap_or_else(|err| {eprintln!("Problem parsing arguments: {err}");process::exit(1);});// --skip--
}

接下來,我們需要更新 Config::build 函數:

impl Config {pub fn build(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> {args.next();let query = match args.next() {Some(arg) => arg,None => return Err("Didn't get a query string"),};let file_path = match args.next() {Some(arg) => arg,None => return Err("Didn't get a file path"),};let ignore_case = env::var("IGNORE_CASE").is_ok();Ok(Config { query, file_path, ignore_case })}
}

我們更新了 Config::build 函數的簽名,所以參數 args 有一個泛型類型,trait 約束為 impl Iterator<Item = String> 而不是 &[String],這意味著 args 可以是任何實現 Iterator trait 并返回 String 項的類型。因為我們獲得了 args 的所有權我們將通過迭代來改變 args,我們可以在 args 參數的說明中添加 mut 關鍵字來使它可變。

使用迭代器適配器使代碼更清晰

項目的 search 函數中利用了迭代器:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {let mut results = Vec::new();for line in contents.lines() {if line.contains(query) {results.push(line);}}results
}

我們可以使用迭代器適配器方法以更簡潔的方式編寫此代碼。這樣做還可以避免使用可變的中間結果向量。

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {contents.lines().filter(|line| line.contains(query)).collect()
}

函數式編程風格傾向于最小化可變狀態的數量,以使代碼更清晰。刪除可變狀態可能會使將來的增強實現并行搜索,因為我們不必管理對結果向量的并發訪問。

類似的,我們修改 search_case_insensitive 函數:

pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {contents.lines().filter(|line| line.to_lowercase().contains(&query.to_lowercase())).collect()
}

在循環或迭代器之間進行選擇

大多數 Rust 程序員更喜歡使用迭代器風格。一開始很難掌握竅門,但是一旦了解了各種迭代器適配器及其功能,就會更容易理解迭代器。

代碼沒有處理循環的各個部分和構建新的向量,而是專注于循環的高級目標。這抽象掉了一些常見的代碼,因此更容易看到這些代碼特有的概念,例如迭代器中的每個元素必須通過的過濾條件。

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

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

相關文章

el-table配置表頭固定而且高度變化

根據官網提示只要在 el-table 元素中定義了 height 屬性&#xff0c;即可實現固定表頭的表格&#xff0c;而不需要額外的代碼。 如果你想既要固定表頭&#xff0c;又要下方表格高度自適應&#xff0c;可以設置為 height"100%" &#xff1a; 然后外層設置scroll:

弱光環境下如何手持相機拍攝靜物:攝影曝光之等效曝光認知

寫在前面 博文內容為一次博物館靜物拍攝筆記的簡單總結內容涉及&#xff1a;弱光環境拍攝靜物如何選擇&#xff0c;以及等效曝光的認知理解不足小伙伴幫忙指正 &#x1f603;,生活加油 我看遠山&#xff0c;遠山悲憫 持續分享技術干貨&#xff0c;感興趣小伙伴可以關注下 _ 采…

ARM筆記-ARM偽指令及編程基礎

第四章 ARM偽指令及編程基礎 4.1 偽指令概述 4.1.1 偽指令定義 人們設計了一些專門用于指導匯編器進行匯編工作的指令&#xff0c;由于這些指令不形成機器碼指令&#xff0c;它們只是在匯編器進行匯編工作的過程中起作用&#xff0c;所以被叫做偽指令。 4.1.2 偽指令特征 …

智能手表怎么申請歐盟EN 18031認證

智能手表申請歐盟 EN 18031 認證&#xff08;針對消費類物聯網設備的網絡安全標準&#xff09;的流程與智能門鎖類似&#xff0c;但需結合手表的功能特性&#xff08;如數據交互、定位、支付等&#xff09;調整合規重點。以下是具體流程和關鍵要點&#xff1a; 一、標準適配與…

算法-全排列

1、全排列函數的使用 舉例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面試加分秘籍:校招數據傾斜場景下的SQL優化方案

校招面試經常會問大家有沒有過調優的經驗&#xff0c;相信大家的回答基本都是往數據傾斜和小文件問題這兩方面回答&#xff0c;對于數據傾斜相信大部分同學對熱key打散或null值引發的傾斜已經非常熟悉&#xff0c;但這些內容面試官也是聽膩了&#xff0c;希望大家在面試時候講一…

Elasticsearch索引機制與Lucene段合并策略深度解析

引言 在現代分布式搜索引擎Elasticsearch中&#xff0c;文檔的索引、更新和刪除操作不僅是用戶交互的核心入口&#xff0c;更是底層存儲架構設計的關鍵挑戰。本文圍繞以下核心鏈路展開&#xff1a; 文檔生命周期管理&#xff1a;從客戶端請求路由到分片定位&#xff0c;從內存…

git提交更改

第一步&#xff1a;添加改動 git add . 第二步&#xff1a;提交改動 git commit -m “替換了 SerialPort 庫文件” 第三步&#xff1a;推送到遠程 git push 為什么git 的UI界面做的遠不如SVN

WPF的基礎控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation屬性2 DockPanel的LastChildFill3 嵌套布局示例4 性能優化建議5 常見問題排查 在WPF開發中&#xff0c;布局控件是構建用戶界面的基石。StackPanel和DockPanel作為兩種最基礎的布局容器&…

互聯網大廠Java求職面試:AI大模型推理服務性能優化與向量數據庫分布式檢索

互聯網大廠Java求職面試&#xff1a;AI大模型推理服務性能優化與向量數據庫分布式檢索 面試現場&#xff1a;技術總監的連環追問 技術總監&#xff1a;&#xff08;翻看著簡歷&#xff09;鄭薪苦&#xff0c;你在上一家公司參與過LLM推理服務的性能優化項目&#xff1f;說說你…

如何解決網站服務器的異常問題?

當網站服務器出現異常情況&#xff0c;導致用戶無法正常訪問網頁信息的時候&#xff0c;該如何解決這一問題呢&#xff1f;小編下面就帶領大家共同探討一下這一問題。 企業在面對網站服務器異常時&#xff0c;首先要對服務器硬件設備進行詳細的檢查&#xff0c;可以使用硬盤檢測…

Day 35

模型可視化與推理 知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化 進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀 推理的寫法&#xff1a;評估模式 模型結構可視化 理解一個深度學習網絡最重要的…

[yolov11改進系列]基于yolov11引入自注意力與卷積混合模塊ACmix提高FPS+檢測效率python源碼+訓練源碼

[ACmix的框架原理] 1.1 ACMix的基本原理 ACmix是一種混合模型&#xff0c;結合了自注意力機制和卷積運算的優勢。它的核心思想是&#xff0c;傳統卷積操作和自注意力模塊的大部分計算都可以通過1x1的卷積來實現。ACmix首先使用1x1卷積對輸入特征圖進行投影&#xff0c;生成一組…

[DS]使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼

使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼 摘要&#xff1a;由于 sample_data.csv 是一個占位符文件&#xff0c;用于代表任意數據集&#xff0c;我將使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼…

【Python 中 lambda、map、filter 和 reduce】詳細功能介紹及用法總結

以下是 Python 中 lambda、map、filter 和 reduce 的詳細功能介紹及用法總結&#xff0c;涵蓋基礎語法、高頻場景和示例代碼。 一、lambda 匿名函數 功能 用于快速定義一次性使用的匿名函數。不需要顯式命名&#xff0c;適合簡化小規模邏輯。 語法 lambda 參數1, 參數2, ..…

貪心算法——分數背包問題

一、背景介紹 給定&#x1d45b;個物品&#xff0c;第&#x1d456;個物品的重量為&#x1d464;&#x1d454;&#x1d461;[&#x1d456;?1]、價值為&#x1d463;&#x1d44e;&#x1d459;[&#x1d456;?1]&#xff0c;和一個容量為&#x1d450;&#x1d44e;&#…

《軟件工程》第 5 章 - 需求分析模型的表示

目錄 5.1需求分析與驗證 5.1.1 順序圖 5.1.2 通信圖 5.1.3 狀態圖 5.1.4 擴充機制 5.2 需求分析的過程模型 5.3 需求優先級分析 5.3.1 確定需求項優先級 5.3.2 排定用例分析的優先順序 5.4 用例分析 5.4.1 精化領域概念模型 5.4.2 設置分析類 5.4.3 構思分析類之間…

基于MATLAB的大規模MIMO信道仿真

1. 系統模型與參數設置 以下是一個單小區大規模MIMO系統的參數配置示例&#xff0c;適用于多發多收和單發單收場景。 % 參數配置 params.N_cell 1; % 小區數量&#xff08;單小區仿真&#xff09; params.cell_radius 500; % 小區半徑&#xff08;米&#xff09…

想查看或修改 MinIO 桶的匿名訪問權限(public/private/custom)

在 Ubuntu 下&#xff0c;如果你想查看或修改 MinIO 桶的匿名訪問權限&#xff08;public/private/custom&#xff09;&#xff0c;需要使用 mc anonymous 命令而不是 mc policy。以下是詳細操作指南&#xff1a; 1. 查看當前匿名訪問權限 mc anonymous get minio/test輸出示例…

HarmonyOS:相機選擇器

一、概述 相機選擇器提供相機拍照與錄制的能力。應用可選擇媒體類型實現拍照和錄制的功能。調用此類接口時&#xff0c;應用必須在界面UIAbility中調用&#xff0c;否則無法啟動cameraPicker應用。 說明 本模塊首批接口從API version 11開始支持。后續版本的新增接口&#xff0…