在Rust中处理命令行参数和环境变量

1.摘要

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

2.读取参数值

在Rust编程中要读取命令行参数的值, 标准库提供了一个函数: std::env::args, 该函数返回一个传递给命令行参数的迭代器, 迭代器中保存了所有参数内容, 调用者需要调用collect方法将其转换成一个集合, 先看一段示例代码:

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

在上面的代码中, 首先使用use语句将std::env模块引入作用域以便使用它的args函数。然后调用其collect()方法, 该方法将接收命令行所有参数内容并保存到变量args中, 接着使用dbg!宏打印了args的内容。

现在将这段代码编译执行会发现没有任何内容输出, 这是因为执行运行没有参数信息, 现在我们设计一个场景, 通过search参数来搜索一个文件, 完整命令如下:

cargo run -- search filename.txt

注意: 参数符号"--"与参数名之间有空格。

执行结果如下:

从返回的结果来看, 集合中保存了三个参数, 实际上第一个参数是我们二进制文件名称, 这跟C语言中的参数列表的行为很类似, 除了获取到调用的程序名称, 还包括所有以空格隔开的参数名称。

3.将参数值保存到变量

在上面的例子中, 参数内容保存到了args变量中, 下面修改一下程序,代码如下:

use std::env;
​
fn main() {let args: Vec<String> = env::args().collect();let param_name = &args[1];let file_name = &args[2];println!("第一个参数名:{}", param_name);println!("第二个参数名:{}", file_name);
}

在上面的代码中, 我们根据数组索引来取变量名称, 例如: args[0]对应是集合中的第一个元素, 也就是二进制程序名, 这个不是我们需要的, 如果要取参数search的内容, 使用args[1], 取文件名使用args[2], 以此类推。

执行结果如下:

通过不同的变量分别接收不同的参数名, 在程序后面的逻辑中, 就可以使用这些保存独立参数的变量名了。

4.处理环境变量

在std::env模块中, 标准库同样提供了获取环境变量的函数,为: env::vars(), 下面的代码将把我这台电脑的环境变量全部打印出来:

use std::env;
​
fn main() {for (key, value) in env::vars() {println!("{} => {}", key, value);}
}

同样, env::vars()返回的也是一个迭代器, 不同的是, 数据结构是以key:value对的形式保存, 程序中分别将key和value进行打印:

下面我们在程序中增加一项功能, 因为打印的参数实在太多, 我想把Path环境变量的内容打印出来该怎么做呢?,修改以下代码:

use std::env;
​
fn main() {let search_key = "PATH";match env::var(search_key) {Ok(val) => {println!("PATH变量保存的内容为:{}", val);},Err(e) => println!("无法找到key:{}, 错误为:{}", search_key, e)}
}

在上面的代码中, 我定义了一个需要搜索的Key名为"PATH", 并使用match正则直接在env::var()的返回迭代器中搜索Key名,这里env::var(param)为什么可以接收参数呢? 进入env.rs源码可以看到以下代码:

env::var()接收需要搜索的Key,返回了一个Result<T, E>类型, 上面还给了一个使用的示例。

从env:var()函数内部,我们可以看到返回的是一个Result<String, VarError>类型,因此,如果获取成功,在Ok()宏中可以设置参数接收结果,而使用Err()宏接收可能因失败返回的错误, 先看下成功的情况, 打印PATH环境变量内容如下:

现在再看一个搜索失败的情况, 将要搜索的key的内容修改为: "SUNTIGER", 执行结果如下:

此时将走另一个流程, 利用Err()宏打印错误信息。

除此之外, std::env包中还包含其他的一些方法, 例如:设置环境变量:set_var()、删除当前运行进程的环境变量:remove_var()等,感兴趣的可以查看Rust的官方文档, 这里不再赘述。

5.总结

在本章节中, 我们探讨了Rust处理命令行参数的常见的两种方式和处理环境变量的两种常见方式, 抛开Rust的语法, 实际上在命令行参数的处理方式上, 与其它语言大同小异, 可能影响我们习惯的也就只剩下语法。Rust在某些机制实现上跟Go语言比起来可能略显繁琐, 但我们在学习任何语言的时候首先要想到每种编程语言的主要特点, 例如: Go语言主打一个语法简洁和高并发, 因此学习Go语言上手感觉特别快, 而且在处理高并发过程中, Go语言的协程和通道使用起来特别容易,性能也非常不错。而Rust的主打特点是内存安全, 要将这种安全思想贯穿全局, Rust会强行转换使用它的每个人的编程思想, 而Rust编译器就像映射的镜子, 任何不好的编程习惯和疏忽换来的都是红色的错误提示。

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

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

相关文章

Mysql快速查找用逗号分割的列中含有某个字符的行:FIND_IN_SET

看标题比较绕口&#xff0c;但是我举一个例子你就清楚了 这是一个查询&#xff1a;我现在想要的是attr_val中含有黑色属性的行&#xff1a; 你用模糊匹配可以&#xff0c;用REGEXP也行&#xff0c;下面介绍一种mysql自带的函数&#xff1a;FIND_IN_SET。它的用法是&#xff1a…

每日汇评:原油价格正在等待欧佩克对2024年供应削减配额的决定

OPEC会议推迟至周四&#xff0c;个别配额和供应削减仍然是会议的核心议题&#xff1b; 原油价格在欧佩克会议前持平&#xff0c;但是否有意外的看涨取决于欧佩克的减产&#xff1b; 布伦特原油价格在关键的82美元和200均线的交叉点被明显拒绝后走低&#xff1b; 上周三&#xf…

JOSEF 漏电继电器JHOK-ZBL1 DH-50L 系统1140V 电源AC220V

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xff08;剩余&#xff09;继电器 …

【傻瓜级JS-DLL-WINCC-PLC交互】3.JS-DLL进行交互

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

玻色量子事件活动

2023年 2023.7 玻色量子携最新相干光量子计算机惊艳亮相2023数字经济大会 2023.6 打造“新型计算数据中心”&#xff01;玻色量子与科华数据&#xff08;002335.SZ&#xff09;携手共创 2023.6 玻色量子“天工量子大脑”亮相中关村论坛&#xff0c;大放异彩 2023.5 100量…

机器学习实战第3天:手写数字识别

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 一、任务描述 二、数据集描述 三、主要代码 &#xff08;1&#xff09;主要代码库的说明与导入方法 &#xff08;2&#xff09;数据预…

实现了父类 纯虚函数为什么还有 无法解析外部符号错误

使用背景&#xff1a; 将C 的函数或接口使用 pybind11 封装成可以供python 使用调用的接口或函数&#xff0c;使用了CMake 编译&#xff08;若之前可以编译通过&#xff0c;现在编译不通过&#xff0c;重新选择 source code 路径&#xff09;成 VS 2019 可使用的目标解决方案&a…

四丶openlayer之瓦片地图

瓦片地图源于一种大地图解决方案&#xff0c;针对一整块非常大的地图进行切片&#xff0c;分成很多相同大小的小块地图&#xff0c;在用户访问的时候&#xff0c;再一块一块小地图加载&#xff0c;拼接在一起&#xff0c;从而还原成一整块大的地图。这样做的优点在于&#xff0…

zblog插件-zblog采集插件下载

在当今数字化的时代&#xff0c;博客已经成为人们分享思想、经验和知识的重要平台。而对于使用zblog博客系统的用户来说&#xff0c;充实博客内容是提高用户体验和吸引读者的不二法门。然而&#xff0c;手动收集内容对于博主来说既费时又繁琐。在这个背景下&#xff0c;zblog插…

QQ导出聊天记录,学会这3个方法,轻松解决!

QQ是我们与他人沟通、交流的重要方式之一。特别是对于那些将QQ作为主要通讯工具的人来说&#xff0c;聊天记录中可能包含了大量重要的信息。那么&#xff0c;如果想要导出QQ聊天记录该怎么办呢&#xff1f;qq导出聊天记录的方法有哪些&#xff1f;本文将为您介绍三种方法&#…

逆向 tg 发送图片

开发工具 工具名称工具类型说明AndroidStuduo编辑工具开发工具jadxjava工具将apk解成java项目xposed插件工具插件tg版本9.7.5 分析源码的点&#xff1a; 发送图片的点 获取sendMessageParams 获取TLRPC$TL_photo 回调 实现 public void sendImg(String path, String…

MyBatis使用教程详解<上>

一. 什么是MyBatis? Mybatis是一个持久层框架,用于简化JDBC的操作MyBatis原本是Apache的一个开源项目ibatis,后来更名为MyBatis 上面我们提到了一个概念----持久层 不知道小伙伴们有没有想到五大注解的关系,类似于下图 其中MyBatis就是Mapper层的框架,是基于JDBC的封装,可以帮…