rust标准库std::env环境相关的常量

 更新时间:2024年03月26日 11:21:37   作者:1024小神  
在本章节中, 我们探讨了Rust处理命令行参数的常见的两种方式和处理环境变量的两种常见方式, 抛开Rust的语法, 实际上在命令行参数的处理方式上, 与其它语言大同小异, 可能影响我们习惯的也就只剩下语法,本文介绍rust标准库std::env的相关知识,感兴趣的朋友一起看看吧

rust标准库std::env环境相关的常量

在env这个库中,有一些环境相关的常量,这些常量在std::env::consts这个模块下面,通过这个依赖库可以获取到当前程序所运行的环境和运行的目录地址等信息。

env 常量

std::env下面一些系统相关的常量:

ARCH	
DLL_EXTENSION
DLL_PREFIX	
DLL_SUFFIX	
EXE_EXTENSION
EXE_SUFFIX	
FAMILY
OS

我们在ubuntu下将这些常量打印出来看一下:

    use std::env;
    println!("ARCH = {}", env::consts::ARCH);
    println!("DLL_EXTENSION = {}", env::consts::DLL_EXTENSION);
    println!("DLL_PREFIX = {}", env::consts::DLL_PREFIX);
    println!("DLL_SUFFIX = {}", env::consts::DLL_SUFFIX);
    println!("EXE_EXTENSION = {}", env::consts::EXE_EXTENSION);
    println!("EXE_SUFFIX = {}", env::consts::EXE_SUFFIX);
    println!("FAMILY = {}", env::consts::FAMILY);
    println!("OS = {}", env::consts::OS);
// 显示结果:
ARCH = x86_64
DLL_EXTENSION = so
DLL_PREFIX = lib
DLL_SUFFIX = .so
EXE_EXTENSION = 
EXE_SUFFIX = 
FAMILY = unix
OS = linux

常用函数 

std::env模块下有如下函数:

args	返回命令行传递的参数
args_os	返回当前进程的参数
current_dir	返回当前的工作目录,该目录保存在PathBuf中
current_exe	返回当前可执行程序的全路径
home_dir	返回当前用户目录的路径
join_paths	添加一些环境变量到PATH这个变量中
remove_var	删除当前运行进程的环境变量(系统中的环境变量不会改变,只改变当前进程的环境变量)
set_current_dir	指定当前可执行程序的工作目录
set_var	将当前进程的环境变量修改为新的值
split_paths	Parses input according to platform conventions for the PATH environment variable.
temp_dir	返回临时文件所存放的目录
var	从当前进程获取环境变量,通过环境变量的key值获取value值
var_os	Fetches the environment variable key from the current process, returning None if the variable isn't set.
vars	Returns an iterator of (variable, value) pairs of strings, for all the environment variables of the current process.
vars_os	Returns an iterator of (variable, value) pairs of OS strings, for all the environment variables of the current process.

补充:

在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编译器就像映射的镜子, 任何不好的编程习惯和疏忽换来的都是红色的错误提示。

到此这篇关于rust标准库std::env环境相关的常量的文章就介绍到这了,更多相关rust标准库std::env内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust之Substrate框架中Core详解

    Rust之Substrate框架中Core详解

    Substrate是一个用于构建区块链的开发框架,它由Parity团队基于Rust语言开发而成,是一个开箱即用的区块链构造器,本文详细介绍了Substrate框架中的Core,需要的朋友可以参考下
    2023-05-05
  • C++的替代:微软如何使用rust?

    C++的替代:微软如何使用rust?

    这篇文章主要介绍了微软如何使用rust的,帮助大家了解c++和rust这两门编程语言的联系与区别,感兴趣的朋友可以了解下
    2020-09-09
  • 关于rust的模块引入问题

    关于rust的模块引入问题

    Rust 语言是一种高效、可靠的通用高级语言,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言,这篇文章主要介绍了rust的模块引入相关知识,需要的朋友可以参考下
    2022-10-10
  • 使用systemd部署r-nacos的操作方法

    使用systemd部署r-nacos的操作方法

    r-nacos是一个用rust实现的nacos服务,我们用它平替java nacos以降低服务占用内存,提升服务的稳定性,这篇文章主要介绍了使用systemd部署r-nacos,需要的朋友可以参考下
    2024-03-03
  • Rust包和Crate超详细讲解

    Rust包和Crate超详细讲解

    这篇文章主要介绍了Rust包管理和Crate,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Rust中的panic定义及触发条件详解

    Rust中的panic定义及触发条件详解

    这篇文章主要为大家介绍了Rust中的panic定义及触发条件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rust语言之Prometheus系统监控工具包的使用详解

    Rust语言之Prometheus系统监控工具包的使用详解

    Prometheus 是一个开源的系统监控和警报工具包,最初是由SoundCloud构建的,随着时间的发展,Prometheus已经具有适用于各种使用场景的版本,为了开发者方便开发,更是有各种语言版本的Prometheus的开发工具包,本文主要介绍Rust版本的Prometheus开发工具包
    2023-10-10
  • Rust 中 Mutex 的基本用法

    Rust 中 Mutex 的基本用法

    Rust 标准库中的 Mutex 结构体位于 std::sync::Mutex 中,它提供了线程安全的数据访问,Mutex 保证了在同一时间只有一个线程可以访问被锁定的数据,这篇文章主要介绍了Rust 中 Mutex 的基本用法,需要的朋友可以参考下
    2024-05-05
  • Rust 累计时间长度的操作方法

    Rust 累计时间长度的操作方法

    在Rust中,如果你想要记录累计时间,通常可以使用标准库中的std::time::Duration类型,这篇文章主要介绍了Rust如何累计时间长度,需要的朋友可以参考下
    2024-05-05
  • Rust 智能指针实现方法

    Rust 智能指针实现方法

    这篇文章主要介绍了Rust 智能指针的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论