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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…