如何在Rust中處理命令行參數(shù)和環(huán)境變量
1.摘要
Rust的命令行和環(huán)境變量處理在標(biāo)準(zhǔn)庫中提供了一整套實(shí)現(xiàn)方法, 在本文中除了探索標(biāo)準(zhǔn)庫的使用方法之外, 也在不斷適應(yīng)Rust獨(dú)有的語法特點(diǎn)。在本文中, 我們通過標(biāo)準(zhǔn)庫函數(shù)的返回值熟悉了迭代器的使用方法, 操作迭代器精確控制保存的內(nèi)容, 包括字符串和鍵值對的使用方法。
2.讀取參數(shù)值
在Rust編程中要讀取命令行參數(shù)的值, 標(biāo)準(zhǔn)庫提供了一個(gè)函數(shù): std::env::args, 該函數(shù)返回一個(gè)傳遞給命令行參數(shù)的迭代器, 迭代器中保存了所有參數(shù)內(nèi)容, 調(diào)用者需要調(diào)用collect方法將其轉(zhuǎn)換成一個(gè)集合, 先看一段示例代碼:
use std::env; ? fn main() { let args: Vec<String> = env::args().collect(); dbg!(args); }
在上面的代碼中, 首先使用use語句將std::env模塊引入作用域以便使用它的args函數(shù)。然后調(diào)用其collect()方法, 該方法將接收命令行所有參數(shù)內(nèi)容并保存到變量args中, 接著使用dbg!宏打印了args的內(nèi)容。
現(xiàn)在將這段代碼編譯執(zhí)行會(huì)發(fā)現(xiàn)沒有任何內(nèi)容輸出, 這是因?yàn)閳?zhí)行運(yùn)行沒有參數(shù)信息, 現(xiàn)在我們設(shè)計(jì)一個(gè)場景, 通過search參數(shù)來搜索一個(gè)文件, 完整命令如下:
cargo run -- search filename.txt
注意: 參數(shù)符號(hào)"--"與參數(shù)名之間有空格。
執(zhí)行結(jié)果如下:
從返回的結(jié)果來看, 集合中保存了三個(gè)參數(shù), 實(shí)際上第一個(gè)參數(shù)是我們二進(jìn)制文件名稱, 這跟C語言中的參數(shù)列表的行為很類似, 除了獲取到調(diào)用的程序名稱, 還包括所有以空格隔開的參數(shù)名稱。
3.將參數(shù)值保存到變量
在上面的例子中, 參數(shù)內(nèi)容保存到了args變量中, 下面修改一下程序,代碼如下:
use std::env; ? fn main() { let args: Vec<String> = env::args().collect(); let param_name = &args[1]; let file_name = &args[2]; println!("第一個(gè)參數(shù)名:{}", param_name); println!("第二個(gè)參數(shù)名:{}", file_name); }
在上面的代碼中, 我們根據(jù)數(shù)組索引來取變量名稱, 例如: args[0]對應(yīng)是集合中的第一個(gè)元素, 也就是二進(jìn)制程序名, 這個(gè)不是我們需要的, 如果要取參數(shù)search的內(nèi)容, 使用args[1], 取文件名使用args[2], 以此類推。
執(zhí)行結(jié)果如下:
通過不同的變量分別接收不同的參數(shù)名, 在程序后面的邏輯中, 就可以使用這些保存獨(dú)立參數(shù)的變量名了。
4.處理環(huán)境變量
在std::env模塊中, 標(biāo)準(zhǔn)庫同樣提供了獲取環(huán)境變量的函數(shù),為: env::vars(), 下面的代碼將把我這臺(tái)電腦的環(huán)境變量全部打印出來:
use std::env; ? fn main() { for (key, value) in env::vars() { println!("{} => {}", key, value); } }
同樣, env::vars()返回的也是一個(gè)迭代器, 不同的是, 數(shù)據(jù)結(jié)構(gòu)是以key:value對的形式保存, 程序中分別將key和value進(jìn)行打印:
下面我們在程序中增加一項(xiàng)功能, 因?yàn)榇蛴〉膮?shù)實(shí)在太多, 我想把Path環(huán)境變量的內(nèi)容打印出來該怎么做呢?,修改以下代碼:
use std::env; ? fn main() { let search_key = "PATH"; match env::var(search_key) { Ok(val) => { println!("PATH變量保存的內(nèi)容為:{}", val); }, Err(e) => println!("無法找到key:{}, 錯(cuò)誤為:{}", search_key, e) } }
在上面的代碼中, 我定義了一個(gè)需要搜索的Key名為"PATH", 并使用match正則直接在env::var()的返回迭代器中搜索Key名,這里env::var(param)為什么可以接收參數(shù)呢? 進(jìn)入env.rs源碼可以看到以下代碼:
env::var()接收需要搜索的Key,返回了一個(gè)Result<T, E>類型, 上面還給了一個(gè)使用的示例。
從env:var()函數(shù)內(nèi)部,我們可以看到返回的是一個(gè)Result<String, VarError>類型,因此,如果獲取成功,在Ok()宏中可以設(shè)置參數(shù)接收結(jié)果,而使用Err()宏接收可能因失敗返回的錯(cuò)誤, 先看下成功的情況, 打印PATH環(huán)境變量內(nèi)容如下:
現(xiàn)在再看一個(gè)搜索失敗的情況, 將要搜索的key的內(nèi)容修改為: "SUNTIGER", 執(zhí)行結(jié)果如下:
此時(shí)將走另一個(gè)流程, 利用Err()宏打印錯(cuò)誤信息。
除此之外, std::env包中還包含其他的一些方法, 例如:設(shè)置環(huán)境變量:set_var()、刪除當(dāng)前運(yùn)行進(jìn)程的環(huán)境變量:remove_var()等,感興趣的可以查看Rust的官方文檔, 這里不再贅述。
5.總結(jié)
在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見的兩種方式和處理環(huán)境變量的兩種常見方式, 拋開Rust的語法, 實(shí)際上在命令行參數(shù)的處理方式上, 與其它語言大同小異, 可能影響我們習(xí)慣的也就只剩下語法。Rust在某些機(jī)制實(shí)現(xiàn)上跟Go語言比起來可能略顯繁瑣, 但我們在學(xué)習(xí)任何語言的時(shí)候首先要想到每種編程語言的主要特點(diǎn), 例如: Go語言主打一個(gè)語法簡潔和高并發(fā), 因此學(xué)習(xí)Go語言上手感覺特別快, 而且在處理高并發(fā)過程中, Go語言的協(xié)程和通道使用起來特別容易,性能也非常不錯(cuò)。而Rust的主打特點(diǎn)是內(nèi)存安全, 要將這種安全思想貫穿全局, Rust會(huì)強(qiáng)行轉(zhuǎn)換使用它的每個(gè)人的編程思想, 而Rust編譯器就像映射的鏡子, 任何不好的編程習(xí)慣和疏忽換來的都是紅色的錯(cuò)誤提示。
到此這篇關(guān)于在Rust中處理命令行參數(shù)和環(huán)境變量的文章就介紹到這了,更多相關(guān)https://blog.csdn.net/suntiger/article/details/134671348內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用cargo install安裝Rust二進(jìn)制工具過程
cargoinstall是一個(gè)用于安裝包含可執(zhí)行目標(biāo)的Rust包的命令行工具,類似于系統(tǒng)軟件包管理器,但它為Rust開發(fā)者提供了一種簡潔的方式來安裝和管理命令行工具,安裝后,二進(jìn)制文件會(huì)存儲(chǔ)在$HOME/.cargo/bin目錄中,需要將該目錄添加到$PATH環(huán)境變量中才能在命令行中直接運(yùn)行2025-02-02rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)
這篇文章主要介紹了rust中間件在項(xiàng)目中的使用實(shí)戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會(huì)話,錯(cuò)誤處理的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Rust使用Sqlx連接Mysql的實(shí)現(xiàn)
數(shù)據(jù)庫在編程中是一個(gè)很重要的環(huán)節(jié),本文主要介紹了Rust使用Sqlx連接Mysql的實(shí)現(xiàn),記錄rust如何操作數(shù)據(jù)庫并以mysql為主的做簡單的使用說明,感興趣的可以了解一下2024-03-03