Rust之构建命令行程序(一):接受命令行参数

在Rust中处理命令行参数和环境变量 Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法。 阅读详情

开发环境

  • Windows 10
  • Rust 1.73.0

 

  • VS Code 1.84.2

项目工程

这次创建了新的工程minigrep.

IO工程:构建命令行程序

这一章回顾了到目前为止你所学的许多技能,并探索了一些更标准的库特性。我们将构建一个与文件和命令行输入/输出交互的命令行工具,来实践一些您现在已经熟悉的Rust概念。

Rust的速度、安全性、单一二进制输出和跨平台支持使其成为创建命令行工具的理想语言,因此对于我们的项目,我们将制作自己版本的经典命令行搜索工具grep(全局搜索正则表达式并打印)。在最简单的用例中,grep在指定的文件中搜索指定的字符串。为此,grep将文件路径和字符串作为其参数。然后,它读取文件,在文件中找到包含字符串参数的行,并打印这些行。

 同时,我们将展示如何让我们的命令行工具使用许多其他命令行工具使用的终端功能。我们将读取一个环境变量的值,以允许用户配置我们工具的行为。我们还将把错误消息打印到标准错误控制台流(stderr)而不是标准输出(stdout ),例如,用户可以将成功的输出重定向到一个文件,同时仍然可以在屏幕上看到错误消息。

Rust社区成员Andrew Gallant已经创建了一个功能齐全、速度非常快的grep版本,名为ripgrep。相比之下,我们的版本会相当简单,但是本章会给你一些背景知识,你需要了解一个现实世界的项目,如ripgrep。

接受命令行参数

让我们创建一个新的项目,一如既往,cargo new。我们称我们的项目为minigrep,以区别于您系统中可能已经有的grep工具。

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

第一个任务是让minigrep接受它的两个命令行参数:文件路径和要搜索的字符串。也就是说,我们希望能够用cargo run运行我们的程序,两个连字符表示下面的参数是我们的程序而不是cargo,一个要搜索的字符串,以及一个要搜索的文件的路径,如下所示:

$ cargo run -- searchstring example-filename.txt

现在,由cargo new生成的程序无法处理我们给它的参数。crates.io上的一些现有库可以帮助编写一个接受命令行参数的程序,但是因为您刚刚学习这个概念,所以让我们自己实现这个功能。

读参数值

 为了使minigrep能够读取我们传递给它的命令行参数的值,我们需要Rust的标准库中提供的std::env::args函数。该函数返回传递给minigrep的命令行参数的迭代器。我们将在后续章节全面讨论迭代器。现在,你只需要知道迭代器的两个细节:迭代器产生一系列的值,我们可以在迭代器上调用collect方法,把它变成一个集合,比如一个vector,包含迭代器产生的所有元素。

示例12-1中的代码允许您的minigrep程序读取传递给它的任何命令行参数,然后将这些值收集到一个向量中。 

文件名:src/main.rs 

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    dbg!(args);
}

示例12-1:将命令行参数收集到一个向量中并打印出来

首先,我们用use语句将std::env模块纳入范围,这样我们就可以使用它的args函数。注意,std::env::args函数嵌套在两层模块中。正如我们在前面的章节中所讨论的,在期望的函数嵌套在多个模块中的情况下,我们选择将父模块而不是函数引入作用域。通过这样做,我们可以轻松地使用std::env中的其他函数。这也比添加use std::env::args,然后只使用args调用函数更明确,因为args可能很容易被误认为是当前模块中定义的函数。 

args函数和无效的Unicode

请注意,如果任何参数包含无效的Unicode,std::env::args将会死机。如果您的程序需要接受包含无效Unicode的参数,请改用std::env::args_os。该函数返回一个迭代器,它产生OsString值而不是String值。为了简单起见,我们在这里选择使用std::env::args,因为OsString值因平台而异,并且比String值更复杂。 

在main的第一行,我们调用env::args,并立即使用collect将迭代器转换为包含迭代器产生的所有值的向量。我们可以使用collect函数创建多种集合,因此我们显式地注释args的类型,以指定我们需要一个字符串向量。虽然我们很少需要在Rust中注释类型,但是collect是一个你经常需要注释的函数,因为Rust不能推断出你想要的集合类型。 

最后,我们使用调试宏打印向量。让我们尝试先不带参数运行代码,然后带两个参数: 

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

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

注意,向量中的第一个值是“target/debug/minigrep”,这是我们的二进制文件的名称。这与C中参数列表的行为相匹配,允许程序使用在执行过程中被调用的名称。如果您想在消息中打印程序名,或者根据调用程序时使用的命令行别名来更改程序的行为,那么访问程序名通常会很方便。但是为了本章的目的,我们将忽略它,只保存我们需要的两个参数。

将参数值保存在变量中

该程序目前能够访问指定为命令行参数的值。现在我们需要将两个参数的值保存在变量中,这样我们就可以在程序的其余部分使用这些值。我们在示例12-2中这样做了。 

文件名:src/main.rs

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = &args[1];
    let file_path = &args[2];

    println!("Searching for {}", query);
    println!("In file {}", file_path);
}

 示例12-2:创建变量来保存查询参数和文件路径参数

正如我们在打印vector时看到的,程序名在args[0]处占用了vector中的第一个值,所以我们从索引1处开始参数。minigrep获取的第一个参数是我们要搜索的字符串,所以我们在变量query中引用了第一个参数。第二个参数将是文件路径,因此我们将对第二个参数的引用放在变量file_path中。 

我们临时打印这些变量的值,以证明代码按照我们的预期工作。让我们用参数test和sample.txt再次运行这个程序:

$ cargo run -- test sample.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
     Running `target/debug/minigrep test sample.txt`
Searching for test
In file sample.txt

太好了,程序工作了!我们需要的参数值被保存到正确的变量中。稍后我们将添加一些错误处理来处理某些潜在的错误情况,比如当用户没有提供参数时;现在,我们将忽略这种情况,转而添加文件读取功能。

本章重点

  • 构建命令行程序的概念
  • 如何构建命令行程序
  • 如何通过程序读取参数值
  • 如何通过程序讲参数值保存在变量中
Rust编程基础教程:命令行工具开发 作者:禅与计算机程序设计艺术 1.背景介绍 随着信息化时代的到来,越来越多的人通过电脑进行各种各样的工作。如何从零开始构建一个具备良好用户体验的命令行工具,是一个非常重要且具有挑战性的任务。经过几年的学习及探索,终于有了一些成熟的技术方案,如CLIs(Command-Line Interfaces) 阅读详情

相关推荐

用Rust创建可靠的命令行程序

2020年是技术领域的元年,编程语言也迎来了翻天覆地的变化。Java、Python、JavaScript等多种语言在这片广袤的市场上掀起了一阵股风,各个方向都有不少开发者投入其中,同时还有一些企业将更加重视其技术能力。而在这些语言中,Rust 则名扬天下。Rust 是一种新兴的编程语言,拥有强大的性能、安全、并发特性和方便开发的特点。本文就带你用 Rust 创建一个可靠的命令行程序,看看它到底有多强悍。Rust 是一门注重速度、零开销、内存安全性和高效开发的系统级编程语言。

AI天才研究院 1524

rust学习 - 构建mini 命令行工具

rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为构建命令行程序的最佳选择。实现一个命令行搜索工具grep,可以在指定文件中搜索指定的字符串。

ngd-b的博客 1529

【Rust】Rust获取命令行参数以及IO操作

Rust作为一门系统编程语言,提供了强大且安全的I/O操作支持。与C/C++不同,Rust通过所有权系统和丰富的类型系统,在编译期就能避免许多常见的I/O错误。Rust的标准库std::io模块包含了大多数I/O功能,而std::fs模块则专门处理文件系统操作。

景天科技苑 5万+

【RUST学习】命令行程序(项目实例)

主要:实现在特定文件中搜索特定的内容。

qq_54384621的博客 846

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1076

Rust:命令行参数与环境变量操作

Rust中,经常碰到命令行参数和环境变量操作。下面主要来了解一下。 一、命令行参数 从上面可以看到,std::env实现了从cargo run 命令行中提取命令行参数 a b c进入程序。 二、环境变量 std::env::var函数,实现了操作系统中环境变量的功能。 ...

代码过客 9847

ArcGIS高效拆分shp文件:无需依赖属性表的实用技巧

本文针对ArcGIS中shp文件因属性表缺失而难以拆分的问题,详细介绍了无需依赖属性表的实用技巧。核心是使用“拆分多部件要素”工具,直接根据图形结构将多个独立但被合并的部件拆分为单个要素,并提供了ArcGIS Pro和ArcMap的操作流程、关键注意事项及拆分后的属性处理方案。

n2o3p4的博客 376

【跟小嘉学 Rust 编程】十二、构建一个命令行程序

本章是一个目前所学的很多技能的应用,以及标准库的探索,我们讲构建一个命令行程序工具来练习现在已经学习过的一些Rust的技能。我们将构建自己的版本的命令行工具:grep(Globally search a Regular Expression and print)。主要教材参考 《The Rust Programming Language》

小嘉丶学长的博客 2987

TPAMI审稿人关注什么

写在开头:被tpami接收大概是每个cs er最开心的事情吧!今天阅读TPAMI的文章时,发现有扩刊的文章,也有不是扩刊的文章,那么这两类文章哪个更容易被接收呢?

carlous0的专栏 1684

YOLOv11改进 | 主干/Backbone篇 | 利用RT-DETR主干网络PPHGNetV2助力yolov11有效涨点(轻量化目标检测网络)

本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv11的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们今天来讲解的网络结构模型,这个网络结构目前还没有推出论文,所以其理论知识在网络上也是非常的少,我也是根据网络结构图进行了分析(精度mAP提高0.05)。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备​目录一、本文介绍。

Snu77的博客 3719

【Rust】Rust学习 第十二章一个 I/O 项目:构建一个命令行程序

本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。grep。grep 是 “egularrint.” 的首字母缩写。grep最简单的使用场景是在特定文件中搜索指定字符串。为此,grep获取一个文件名和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。

StudyWinter的博客 2064

mapbox高阶,加载倾斜摄影

本文详细介绍如何基于mapbox-gl v3.8.0版本实现倾斜摄影的加载,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 344

12-输入/输出项目构建命令行程序

测试驱动开发(TDD, test-driven development)是一种软件开发方法,即在实际代码执行之前编写测试。它是一种用于确保所开发的软件满足指定要求的技术,并有助于在开发周期的早期捕捉错误。该过程遵循一个短暂的重复周期,Red-Green-Refactor,即 "红-绿-重构":①. 红色编写一个定义函数或函数改进的测试,该测试最初失败的原因应该是函数不存在或不按预期执行。②. 绿色:编写通过测试所需的最少代码量。这一阶段的主要目标是在遵守指定要求的前提下尽快通过测试。

优快云爱好者的独到见解 1322

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 802

MCAL中Dsadc的配置

DSADC模块作为一个专用的模块,主要应用在编码器软解码,功能强大而复杂,这里介绍了Dsadc的mcal配置和详细描述,让你全面学习和理解这个模块功能和应用。

dhyw12399999的博客 787

The Rust Programming Language - 第12章 一个I/O项目:构建命令行程序 - 12.1 接受命令行参数

12 一个I/O项目:构建命令行程序 本章我们将会构建一个与文件和命令行输入/输出交互的命令行工具来练习已经学过的Rust技能 Rust的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们将创建一个我们自己的经典命令行工具grep(globally research a regular expression and print) Grep最简单的使用场景是在特定文件中搜索指定字符串 在这个过程中,我们的命令行工具会用到终端功能,读取环境变量来使得用户可以配置工具,打印到

weixin_51487151的博客 423

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Rust学习-构建命令行程序

Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择本文以实现一个minigrep为例,展开对之前学习的回归。

wangkai6666的博客 1458

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Rust从0到1实战系列篇 如何一个 I/O 项目:构建一个命令行程序

本章通过构建一个简化版grep命令行程序来练习Rust的关键功能。项目名为minigrep,能够接受文件路径和搜索字符串两个参数,读取文件内容并打印匹配行。首先使用std::env::args()获取命令行参数,将查询字符串和文件路径存入变量。然后通过std::fs::read_to_string读取文件内容并打印。虽然当前功能简单,但后续会处理错误并分离功能模块。这个项目展示了Rust在构建命令行工具方面的优势,并为理解更复杂的类似项目(如ripgrep)打下基础。完整代码可从示例12-1至12-4中查看

m0_68635815的博客 795

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Rust之构建命令行程序(三):重构改进模块化和错误处理

Rust之构建命令行程序(三):重构改进模块化和错误处理

wing的专栏 1652

Rust之构建命令行程序(六):信息写入

Rust之构建命令行程序(六):信息写入

wing的专栏 1139

11、Rust程序设计语言——构建一个命令行程序

Rust学习笔记

qq_51180928的博客 499

【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容

本系列文章章将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。grep是 “GRegularEPrint.” 的首字母缩写。grep最简单的使用场景是在特定文件中搜索指定字符串。为此,grep获取一个文件名和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。以上就是本节的所有内容。如何接收命令行参数将命令行参数拆解开来。......

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 9万+

Rust学习记录--C12 实例:写一个命令行程序

要求:在一个文件中搜索字符串返回对应的行的列表。

weixin_44900096的博客 905

30天拿下Rust之命令行参数

在Rust中,命令行参数是程序从命令行接收的输入,它们为程序提供了运行时配置和数据的灵活性。对于需要用户交互或自动化脚本的Rust程序来说,正确地解析命令行参数至关重要。通过std::env::args和第三方库(比如:clap),我们可以轻松地获取和解析命令行参数,并根据需要处理它们。在实际开发中,结合错误处理和优雅退出的策略,可以确保程序在面对不符合预期的参数时能够给出有用的反馈。

hope_wisdom的技术博客 2100

rust从0开始写项目-06-如何接受命令行参数clap-01

写web项目或者app等,必不可少的要接受参数和校验参数的准确性,基本也是项目开始的第一步,那么我们今天来看下rust提供了哪些优秀的crates。我们可以使用 Command::action 方法来设置 参数行为。你也可以使用 command!我们可以使用 Command::subcommand 方法添加子命令。我们使用 Command::arg_required_else_help 如果参数不存在,优雅的退出。我们可以使用 Command::arg 方法来添加 Arg 对象来添加命令行参数。

a...Z 1954
上一篇: Rust之自动化测试(三): 测试组合
下一篇: Rust之构建命令行程序(二):读取文件
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值