当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-11-30 17:31:35 385观看
导读1.摘要Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭

1.摘要

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

VCC28资讯网——每日最新资讯28at.com

2.读取参数值

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

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

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

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

cargo run -- search filename.txt

注意: 参数符号"--"与参数名之间有空格。VCC28资讯网——每日最新资讯28at.com

执行结果如下:VCC28资讯网——每日最新资讯28at.com

图片图片VCC28资讯网——每日最新资讯28at.com

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

VCC28资讯网——每日最新资讯28at.com

3.将参数值保存到变量

在上面的例子中, 参数内容保存到了args变量中, 下面修改一下程序,代码如下:VCC28资讯网——每日最新资讯28at.com

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], 以此类推。VCC28资讯网——每日最新资讯28at.com

执行结果如下:VCC28资讯网——每日最新资讯28at.com

图片图片VCC28资讯网——每日最新资讯28at.com

通过不同的变量分别接收不同的参数名, 在程序后面的逻辑中, 就可以使用这些保存独立参数的变量名了。VCC28资讯网——每日最新资讯28at.com

VCC28资讯网——每日最新资讯28at.com

4.处理环境变量

在std::env模块中, 标准库同样提供了获取环境变量的函数,为: env::vars(), 下面的代码将把我这台电脑的环境变量全部打印出来:VCC28资讯网——每日最新资讯28at.com

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

同样, env::vars()返回的也是一个迭代器, 不同的是, 数据结构是以key:value对的形式保存, 程序中分别将key和value进行打印:VCC28资讯网——每日最新资讯28at.com

图片图片VCC28资讯网——每日最新资讯28at.com

下面我们在程序中增加一项功能, 因为打印的参数实在太多, 我想把Path环境变量的内容打印出来该怎么做呢?,修改以下代码:VCC28资讯网——每日最新资讯28at.com

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源码可以看到以下代码:VCC28资讯网——每日最新资讯28at.com

图片图片VCC28资讯网——每日最新资讯28at.com

env::var()接收需要搜索的Key,返回了一个Result<T, E>类型, 上面还给了一个使用的示例。VCC28资讯网——每日最新资讯28at.com

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

图片图片VCC28资讯网——每日最新资讯28at.com

现在再看一个搜索失败的情况, 将要搜索的key的内容修改为: "SUNTIGER", 执行结果如下:VCC28资讯网——每日最新资讯28at.com

图片图片VCC28资讯网——每日最新资讯28at.com

此时将走另一个流程, 利用Err()宏打印错误信息。VCC28资讯网——每日最新资讯28at.com

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

VCC28资讯网——每日最新资讯28at.com

5.总结

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

VCC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-35580-0.html在Rust中处理命令行参数和环境变量

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 仅用 CSS 实现网页阅读进度条

下一篇: 十分钟搞定前端虚拟列表

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top