学习Rust的第21天:mini_grep第1部分

在本文中,我们开始用 Rust 构建一个类似 grep 的程序。我们涵盖了读取命令行参数、读取文件内容,并开始通过将程序构造为函数和结构体来重构程序。

Introduction 介绍

Running the following command will create a new project
运行以下命令将创建一个新项目

$ cargo new minigrepCreated binary (application) `minigrep` project
$ cd minigrep

The program that we are building will take in two arguments :
我们正在构建的程序将接受两个参数:

  1. search_string: String = This will be the key that we are searching for
    search_string: String = 这将是我们正在搜索的键
  2. file_name: String = This is the file that is going to be searched
    file_name: String = 这是要搜索的文件

The run command is going to look something like this
运行命令看起来像这样

$ cargo run search_string file_name

Reading arguments 阅读论证

To read arguments, we need to import the env module from the std library.
要读取参数,我们需要从 std 库导入 env 模块。

And call the env::args().collect() method, this will return an iterator that we can use.
并调用 env::args().collect() 方法,这将返回一个我们可以使用的迭代器。

use std::env;fn main(){let args: Vec<String> = env::args().collect();println!("{:#?}",args);
}

Running this and passing some arguments will give the following output
运行它并传递一些参数将给出以下输出

$ cargo run minigrep projectFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/minigrep minigrep project`["target/debug/minigrep","minigrep","project",
]

As you can see we got the arguments that we passed into the project
正如你所看到的,我们得到了传递到项目中的参数

Here we don’t really care about the binary path, all we need is the last two elements of this vector.
这里我们并不真正关心二进制路径,我们只需要这个向量的最后两个元素。

Let’s get to organizing this data…
让我们开始组织这些数据......

use std::env;fn main(){let args: Vec<String> = env::args().collect();let query = &args[1];let filename = &args[2];}

Reading a file 读取文件

Now that we know what file to read, let’s get to reading?
现在我们知道要读取什么文件了,让我们开始读取吧?

To read, first let’s just create a file in the root of out crate, I am gonna name it lorem.txt and have a bunch of lorem ipsum in there…
为了阅读,首先让我们在板条箱的根目录中创建一个文件,我将其命名为 lorem.txt 并在其中放置一堆 lorem ipsum...

$ cat lorem.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

To read files we need to use the fs module from the standard library, FS stands for file system…
要读取文件,我们需要使用标准库中的 fs 模块,FS代表文件系统......

Then we’ll use the function, read_to_string with the file path as the function argument to get the output as a string, this function returns a Result enum, In the error case we will print out “something went wrong reading the file”
然后我们将使用函数 read_to_string 以文件路径作为函数参数来获取字符串输出,该函数返回一个 Result 枚举,在错误情况下我们将打印出“读取文件时出错”

use std::env;
use std::fs;fn main(){let args: Vec<String> = env::args().collect();let query = &args[1];let file = &args[2];let contents = fs::read_to_string(file).expect("Something went wrong reading the file");println!("file contents: {}",contents);
}

Output: 输出:

$ cargo run example lorem.txtfile contents: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

Refactoring 重构

Now that we have the basics of the program setup, lets refactor the program…
现在我们已经有了程序设置的基础知识,让我们重构程序......

Our main function has a lot of responsibilities at the moment, So today we will distribute it into functions and structs, and do the rest in tomorrow’s article.
我们的 main 函数目前有很多职责,所以今天我们将把它分成函数和结构体,剩下的在明天的文章中完成。
Lets take a look at the code and then the line by line explanation
让我们看一下代码,然后逐行解释

use std::env;
use std::fs;
use std::process;
use std::error::Error;struct Config {query: String,file: String,
}impl Config{fn new(args: &[String]) -> Result<Config, &str>{if args.len() < 3{return Err("Not enough arguments.");}let query: String = args[1].clone();let file: String = args[2].clone();Ok(Config{query,file})}
}fn run(config: Config) -> Result<(), Box<dyn Error>>{let contents = fs::read_to_string(config.file)?;println!("file contents: {}",contents);Ok(())
}fn main(){let args: Vec<String> = env::args().collect();let config = Config::new(&args).unwrap_or_else(|err|{println!("Problem parsing arguments: {}",err);println!("Expected: {} search_query filename", args[0]);process::exit(1);});if let Err(e) = run(config) {println!("Application error: {}",e);process::exit(1);}
}

Explanation: 解释:

use std::env;
use std::fs;
use std::process;
use std::error::Error;

These lines import specific modules from the standard library (std).
这些行从标准库 ( std ) 导入特定模块。

  • env: Provides functions for interacting with the environment (e.g., command-line arguments).
    env :提供与环境交互的函数(例如命令行参数)。
  • fs: Offers file system operations like reading and writing files.
    fs :提供文件系统操作,例如读取和写入文件。
  • process: Provides functions for interacting with processes (e.g., exiting a process).
    process :提供与进程交互的功能(例如,退出进程)。
  • error::Error: Imports the Error trait, which is used for error handling.
    error::Error :导入 Error 特征,用于错误处理。
struct Config {query: String,file: String,
}
  • Defines a struct named Config with two fields: query and file, both of type String.
    定义一个名为 Config 的结构体,其中包含两个字段: query 和 file ,均为 String 类型。
impl Config{fn new(args: &[String]) -> Result<Config, &str>{if args.len() < 3 {return Err("Not enough arguments.");}let query: String = args[1].clone();let file: String = args[2].clone();Ok(Config{query, file})}
}

Implements methods for the Config struct.
实现 Config 结构的方法。

  • Defines a constructor method new for creating a new Config instance.
    定义一个构造函数方法 new 用于创建新的 Config 实例。
  • Takes a slice of strings (&[String]) representing command-line arguments as input.
    将表示命令行参数的字符串片段 ( &[String] ) 作为输入。
  • Returns a Result where Ok contains a Config instance if arguments are sufficient, and Err contains an error message otherwise.
    如果参数足够,则返回 Result ,其中 Ok 包含 Config 实例,否则 Err 包含错误消息。
fn run(config: Config) -> Result<(), Box<dyn Error>>{let contents = fs::read_to_string(config.file)?;println!("file contents: {}",contents);Ok(())
}

Defines a function run that takes a Config instance as input.
定义一个函数 run ,它将 Config 实例作为输入。

  • Attempts to read the contents of the file specified in the Config.
    尝试读取 Config 中指定的文件的内容。
  • Prints the contents of the file.
    打印文件的内容。
  • Returns Ok(()) if successful, indicating no error.
    如果成功则返回 Ok(()) ,表示没有错误。
fn main(){let args: Vec<String> = env::args().collect();let config = Config::new(&args).unwrap_or_else(|err|{println!("Problem parsing arguments: {}",err);println!("Expected: {} search_query filename", args[0]);process::exit(1);});if let Err(e) = run(config) {println!("Application error: {}",e);process::exit(1);}
}

Defines the main function, the entry point of the program.
定义 main 函数,程序的入口点。

  • Retrieves command-line arguments and collects them into a vector of strings.
    检索命令行参数并将它们收集到字符串向量中。
  • Attempts to create a Config instance from the command-line arguments.
    尝试从命令行参数创建 Config 实例。
  • If successful, continues with the program execution.
    如果成功,则继续执行程序。
  • If unsuccessful, prints an error message and exits the program.
    如果不成功,则打印错误消息并退出程序。
  • Calls the run function with the Config instance.
    使用 Config 实例调用 run 函数。
  • Handles any errors that occur during the execution of run by printing an error message and exiting the program.
    通过打印错误消息并退出程序来处理 run 执行期间发生的任何错误。
let config = Config::new(&args).unwrap_or_else(|err|{println!("Problem parsing arguments: {}",err);println!("Expected: {} search_query filename", args[0]);process::exit(1);});
  • This is a closure, an error-handling mechanism used when creating a Config instance from command-line arguments. It prints error details and expected usage if parsing fails, then exits the program with an error code. We will study about closures in detail in the upcoming articles
    这是一个闭包,是从命令行参数创建 Config 实例时使用的错误处理机制。如果解析失败,它会打印错误详细信息和预期用法,然后使用错误代码退出程序。我们将在接下来的文章中详细研究闭包

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

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

相关文章

应急学院物联网应急安全产教融合基地解决方案

第一章 背景 1.1物联网应急安全产教融合发展概况 物联网应急安全产教融合发展是当前社会发展的重要趋势。随着物联网技术的广泛应用&#xff0c;应急安全领域对人才的需求日益迫切。因此&#xff0c;产教融合成为培养高素质、专业化人才的关键途径。在这一背景下&#xff0c;…

02.Kafka部署安装

1 Linux 安装 Kafka 1.1 安装前的环境准备 由于 Kafka 是用 Scala 语言开发的&#xff0c;运行在 JVM 上&#xff0c;因此在安装Kafka之前需要先安装JDK。 yum install java-1.8.0-openjdk* -y kafka 依赖 zookeeper&#xff0c;所以需要先安装 zookeeper。 wget https://ar…

LLM优化:开源星火13B显卡及内存占用优化

1. 背景 本qiang~这两天接了一个任务&#xff0c;部署几个开源的模型&#xff0c;并且将本地经过全量微调的模型与开源模型做一个效果对比。 部署的开源模型包括&#xff1a;星火13B&#xff0c;Baichuan2-13B, ChatGLM6B等 其他两个模型基于transformers架构封装&#xff0…

表单提交出现问题却没有报错

最近搞毕设提交表单传给后台总是出现错误&#xff0c;有时候可以运行成功&#xff0c;有时候运行不了但是没有报错&#xff0c;以为是jQuery导入的问题尝试换了jQuery的其他导入方式没有解决&#xff0c;后来发现前端页面的表单要防止默认操作&#xff01;&#xff01;&#xf…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结&#xff0c;感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;在20世纪30年代提出的&#xff0c;最初用于制造业的质量管理。休哈特博士在构想PDCA…

【C++题解】1418. 求一个5位数的各个位之和

问题&#xff1a;1418. 求一个5位数的各个位之和 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 从键盘读入一个 5 位的正整数&#xff0c;请求出这个 5 位数的各个位之和。 输入&#xff1a; 一个 5 位的正整数 n 。 输出&#xff1a; 这个 5 位数的各个位之…

Aiseesoft Blu-ray Player for Mac:蓝光播放器

Aiseesoft Blu-ray Player for Mac是一款功能强大且易于使用的蓝光播放器&#xff0c;专为Mac用户打造。它以其卓越的性能和简洁的操作界面&#xff0c;为用户带来了全新的高清蓝光播放体验。 Aiseesoft Blu-ray Player for Mac v6.6.50激活版下载 这款软件支持播放任何高质量的…

ArcGIS Pro3.0软件破解版安装教程

软件名称&#xff1a;ArcGIS Pro 3.0 安装环境&#xff1a;Windows 软件大小&#xff1a;7.3GB 硬件要求&#xff1a;CPU2GHz&#xff0c;内存4G(或更高) 百度云下载链接 &#xff1a; https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 &#xff1a;r0w1 教学内…

AI图书推荐:ChatGPT写论文的流程与策略

论文一直是任何学术学位的顶峰。它展示了学生在研究领域的兴趣和专业知识。撰写论文也是一个学习经验&#xff0c;为学术工作以及专业研究角色做好准备。但是&#xff0c;论文工作总是艰苦的&#xff0c;通常是充满乐趣和创造性的&#xff0c;但有时也是乏味和无聊的。生成式人…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

采用前后端分离Vue,Ant-Design技术开发的(手麻系统成品源码)适用于三甲医院

开发环境 技术架构&#xff1a;前后端分离 开发语言&#xff1a;C#.net6.0 开发工具&#xff1a;vs2022,vscode 前端框架&#xff1a;Vue,Ant-Design 后端框架&#xff1a;百小僧开源框架 数 据 库&#xff1a;sqlserver2019 系统特性 麻zui、护理、PACU等围术期业务全覆…

FreeRTOS学习——FreeRTOS队列(上)

本篇文章记录我学习FreeRTOS队列的相关知识&#xff0c;主要包括队列简介、队列的结构体、队列创建等知识。 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中断之间传递消息&#xff0c;队列中可以存储有限的、大小固定的数据项目。…

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中&#xff0c;经常需要自定义控件&#xff0c;并且定义控件的属性&#xff0c;方便灵活的修改控件的显示样式&#xff0c;提…

IT廉连看——UniApp——样式绑定

IT廉连看——UniApp——样式绑定 一、样式绑定 两种添加样式的方法&#xff1a; 1、第一种写法 写一个class属性&#xff0c;然后将css样式写在style中。 2、第二种写法 直接把style写在class后面 添加一些效果&#xff1a;字体大小 查看效果 证明这样添加样式是没有问题的…

【提示学习论文】PMF:Efficient Multimodal Fusion via Interactive Prompting论文原理

Efficient Multimodal Fusion via Interactive Prompting&#xff08;CVPR2023&#xff09; 基于交互式提示的高效多模态融合方法减少针对下游任务微调模型的计算成本提出模块化多模态融合架构&#xff0c;促进不同模态之间的相互交互将普通提示分为三种类型&#xff0c;仅在单…

websocket 单点通信,广播通信

Websocket协议是对http的改进&#xff0c;可以实现client 与 server之间的双向通信&#xff1b; websocket连接一旦建立就始终保持&#xff0c;直到client或server 中断连接&#xff0c;弥补了http无法保持长连接的不足&#xff0c;方便了客户端应用与服务器之间实时通信。 参…

大数据005-hadoop003-了解MR及Java的简单实现

了解MapReduce MapReduce过程分为两个阶段&#xff1a;map阶段、reduce阶段。每个阶段搜键-值对作为输入和输出。 要执行一个MR任务&#xff0c;需要完成map、reduce函数的代码开发。 Hellow World 【Hadoop权威指南】中的以分析气象数据为例&#xff0c;找到每年的最高气温。…

Jenkins持续化集成

优质博文&#xff1a;IT-BLOG-CN 工作过程如下环境准备 开发人员提交代码>jenkins获取代码>调用单元测试>打包>发布 环境准备Jenkins的安装 Tomcat、Maven、Git或Svn、Jdk Jenkins的安装 1、官网下载war &#xff1a;http://Jenkins-ci.org/ 2、tomcat-users.…

NTFS文件权限管理

实验环境 windows server 2016 实验要求 实验步骤 1、 新建文件 2、打开文件夹的属性->安全->高级 3、禁用继承 4、添加组或用户 技术资料&#xff1a; 常用软件&#xff1a; 手机端项目&#xff1a; 电脑端项目&#xff1a; 公司制度&#xff1a; 销售资源&#xff…