【Rust自学】12.1. 接收命令行参数

embedded/2025/1/13 14:46:43/

12.1.0. 写在正文之前

第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。

这个项目分为这么几步:

  • 接收命令行参数(本文)
  • 读取文件
  • 重构:改进模块和错误处理
  • 使用TDD(测试驱动开发)开发库功能
  • 使用环境变量
  • 将错误信息写入标准错误而不是标准输出

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
请添加图片描述

12.1.1. 规范输入格式

我们首先要规范一个输入格式来固定用于传入参数的方式,我这里是这么规定的:

cargo run 文本内容 指定的文件.txt

12.1.2. 读取命令行参数

完成了对输入的规范,接下来就要解决读取命令行参数的问题。

这里需要使用一个由Rust标准库提供的函数std::env::args()。这个函数会返回迭代器(第13章会讲),产生一系列的值。对于迭代器可以使用collect这个方法把这一系列的值转化为一个集合,比如说一个Vector

在 7.4. use关键字 Pt.1 讲过,当函数被嵌套着不止一层的模块时,通常将其父模块引入作用域。

代码如下:

rust">use std::env;fn main() {let args:Vec<String> = env::args().collect();
}

由于collect会产生集合,但是集合内的元素类型Rust无法推断,所以在声明时需要显式声明args的类型是Vec<String>

使用println!来看看效果如何吧:

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

输出1(没有带任何参数):

$ cargo runCompiling minigrep v0.1.0 (file:///projects/minigrep)Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61sRunning `target/debug/minigrep`
[src/main.rs:5:5] args = ["target/debug/minigrep",
]

输出2(带了参数):

$ cargo run -- needle haystackCompiling minigrep v0.1.0 (file:///projects/minigrep)Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.57sRunning `target/debug/minigrep needle haystack`
[src/main.rs:5:5] args = ["target/debug/minigrep","needle","haystack",
]

在第二个例子中的--是用来区分Cargo 命令的参数传递给程序的参数的。它的作用是告诉 Cargo,接下来的内容不是 Cargo 的选项或参数,而是运行程序时需要传递给程序的参数。env::agrs并不会读取并存储它。

可以看到,即使不带参数,这个Vector都会有一个元素,其值是当前执行的这个二进制程序,也就是这个例子里的"target/debug/minigrep"。所以说实际上我们需要的参数得从args的第二个元素开始获取,也就是索引1的位置。

知道了需要的参数存放在哪个位置,就可以声明变量来存储了。声明一个query用于存储需要查找的文本,声明一个filename来存储指定的文件的名称:

rust">let query = &args[1]; 
let filename = &args[2];

这样写是没有问题的,如果用户输入的参数缺失导致索引越界了Rust会直接恐慌停止程序。当然使用matchget函数的组合也可以:

rust">let query = match args.get(1) {  Some(arg) => arg,  None => panic!("No query provided"),  
};  
let filename = match args.get(2) {  Some(arg) => arg,  None => panic!("No file name provided"),  
};

这里就使用第一种方法。

再通过打印出这两个变量来让用户确认自己的输入:

rust">println!("search for {}", query);  
println!("In file {}", filename);

12.1.3. 整体代码

以下就是截止到本文所写出的所有代码:

rust">use std::env;  fn main() {  let args:Vec<String> = env::args().collect();  let query = &args[1];  let filename = &args[2];println!("search for {}", query);  println!("In file {}", filename);  
}

http://www.ppmy.cn/embedded/153580.html

相关文章

MATLAB安装Robotics Toolbox(机器人工具箱)插件

一、下载工具箱安装包http://petercorke.com/wordpress/toolboxes/robotics-toolbox 二、将文件夹放到MATLAB安装文件夹指定目录下 三、打开MATLAB&#xff0c;主页------设置路径-----选添加并包含子文件夹-------选择这个rvctools文件夹save&#xff08;保存&#xff09;-clo…

软件项目管理软件实现步骤

一、明确需求 在开发项目管理软件前&#xff0c;首先要明确用户的需求&#xff0c;软件管理软件的用户包括项目经理、团队成员、顾客等&#xff0c;他们的需求可能不相同。通过调研或者访谈的方式&#xff0c;了解用户的实际需求。 问卷调查&#xff1a;通过问卷的方式&#…

CSS Grid 布局全攻略:从基础到进阶

文章目录 一.Grid 是什么二.示例代码1. 基础使用 - 固定宽高2.百分百宽高3.重复设置-repeat4.单位-fr5.自适应6.间距定义其他 一.Grid 是什么 CSS 中 Grid 是一种强大的布局方式&#xff0c;它可以同时处理行和列 Grid 和Flex有一些类似&#xff0c;都是由父元素包裹子元素使用…

深度学习与机器学习的关系和差别?

深度学习与机器学习既有紧密的联系&#xff0c;又存在明显的差别&#xff1a; 关系 深度学习是机器学习的分支&#xff1a;机器学习是一门多领域交叉学科&#xff0c;旨在让计算机通过数据学习模式&#xff0c;并利用这些模式进行预测或决策。深度学习则是机器学习中的一个特…

电商项目-基于ElasticSearch实现商品搜索功能(三)

本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码&#xff0c;介绍代码逻辑和代码实现。 主要实现功能&#xff1a;根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal&#xff0c;…

线程安全问题介绍

文章目录 **什么是线程安全&#xff1f;****为什么会出现线程安全问题&#xff1f;****线程安全问题的常见场景****如何解决线程安全问题&#xff1f;**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…

【Bluedroid】HFP连接流程源码分析(一)

Bluedroid 蓝牙 HFP 连接流程涵盖多个环节&#xff0c;从前期准备到连接建立、状态管理以及维护与断开&#xff0c;各环节紧密相扣&#xff0c;确保蓝牙免提连接稳定可靠。 一、概述 1.1. 连接前准备 用户操作&#xff1a;用户需在 Android 设备上开启蓝牙功能。同时&#x…

【蓝桥杯——物联网设计与开发】Part2:OLED

目录 一、OLED &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;驱动原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、OLED接口函数封装 &#x1f7e1;️OLED_Wri…