rust標準庫std::env環(huán)境相關的常量
rust標準庫std::env環(huán)境相關的常量
在env這個庫中,有一些環(huán)境相關的常量,這些常量在std::env::consts這個模塊下面,通過這個依賴庫可以獲取到當前程序所運行的環(huán)境和運行的目錄地址等信息。
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 返回當前可執(zhí)行程序的全路徑 home_dir 返回當前用戶目錄的路徑 join_paths 添加一些環(huán)境變量到PATH這個變量中 remove_var 刪除當前運行進程的環(huán)境變量(系統中的環(huán)境變量不會改變,只改變當前進程的環(huán)境變量) set_current_dir 指定當前可執(zhí)行程序的工作目錄 set_var 將當前進程的環(huán)境變量修改為新的值 split_paths Parses input according to platform conventions for the PATH environment variable. temp_dir 返回臨時文件所存放的目錄 var 從當前進程獲取環(huán)境變量,通過環(huán)境變量的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中處理命令行參數和環(huán)境變量
1.摘要
Rust的命令行和環(huán)境變量處理在標準庫中提供了一整套實現方法, 在本文中除了探索標準庫的使用方法之外, 也在不斷適應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的內容。
現在將這段代碼編譯執(zhí)行會發(fā)現沒有任何內容輸出, 這是因為執(zhí)行運行沒有參數信息, 現在我們設計一個場景, 通過search參數來搜索一個文件, 完整命令如下:
cargo run -- search filename.txt
注意: 參數符號"--"與參數名之間有空格。
執(zhí)行結果如下:
從返回的結果來看, 集合中保存了三個參數, 實際上第一個參數是我們二進制文件名稱, 這跟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], 以此類推。
執(zhí)行結果如下:
通過不同的變量分別接收不同的參數名, 在程序后面的邏輯中, 就可以使用這些保存獨立參數的變量名了。
4.處理環(huán)境變量
在std::env模塊中, 標準庫同樣提供了獲取環(huán)境變量的函數,為: env::vars(), 下面的代碼將把我這臺電腦的環(huán)境變量全部打印出來:
use std::env; ? fn main() { for (key, value) in env::vars() { println!("{} => {}", key, value); } }
同樣, env::vars()返回的也是一個迭代器, 不同的是, 數據結構是以key:value對的形式保存, 程序中分別將key和value進行打印:
下面我們在程序中增加一項功能, 因為打印的參數實在太多, 我想把Path環(huán)境變量的內容打印出來該怎么做呢?,修改以下代碼:
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環(huán)境變量內容如下:
現在再看一個搜索失敗的情況, 將要搜索的key的內容修改為: "SUNTIGER", 執(zhí)行結果如下:
此時將走另一個流程, 利用Err()宏打印錯誤信息。
除此之外, std::env包中還包含其他的一些方法, 例如:設置環(huán)境變量:set_var()、刪除當前運行進程的環(huán)境變量:remove_var()等,感興趣的可以查看Rust的官方文檔, 這里不再贅述。
5.總結
在本章節(jié)中, 我們探討了Rust處理命令行參數的常見的兩種方式和處理環(huán)境變量的兩種常見方式, 拋開Rust的語法, 實際上在命令行參數的處理方式上, 與其它語言大同小異, 可能影響我們習慣的也就只剩下語法。Rust在某些機制實現上跟Go語言比起來可能略顯繁瑣, 但我們在學習任何語言的時候首先要想到每種編程語言的主要特點, 例如: Go語言主打一個語法簡潔和高并發(fā), 因此學習Go語言上手感覺特別快, 而且在處理高并發(fā)過程中, Go語言的協程和通道使用起來特別容易,性能也非常不錯。而Rust的主打特點是內存安全, 要將這種安全思想貫穿全局, Rust會強行轉換使用它的每個人的編程思想, 而Rust編譯器就像映射的鏡子, 任何不好的編程習慣和疏忽換來的都是紅色的錯誤提示。
到此這篇關于rust標準庫std::env環(huán)境相關的常量的文章就介紹到這了,更多相關rust標準庫std::env內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
rust 如何使用 cargo-nextest 替代 cargo te
cargo-nextest 是新一代的rust測試程序,能夠極大提升測試性能,可以完全替代 cargo test 命令,這篇文章主要介紹了rust 如何使用 cargo-nextest 替代 cargo test,需要的朋友可以參考下2024-05-05在win10上使用mingw64編譯器配置Rust開發(fā)環(huán)境和idea 配置Rust 插件
在win10上配置 Rust 開發(fā)環(huán)境(使用 mingw64編譯器)和 idea 配置 Rust 插件的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-03-03關于使用rust調用c++靜態(tài)庫并編譯nodejs包的問題
這篇文章主要介紹了使用rust調用c++靜態(tài)庫并編譯nodejs包的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08