使用環(huán)境變量實(shí)現(xiàn)Rust程序中的不區(qū)分大小寫搜索方式
步驟 1:編寫失敗的測(cè)試
我們遵循測(cè)試驅(qū)動(dòng)開發(fā)(TDD)方法,首先編寫一個(gè)測(cè)試來(lái)驗(yàn)證不區(qū)分大小寫搜索功能。由于我們尚未實(shí)現(xiàn)該功能,因此這個(gè)測(cè)試會(huì)失敗。
以下是測(cè)試代碼:
#[cfg(test)] mod tests { use super::*; // 測(cè)試:區(qū)分大小寫的搜索 #[test] fn case_sensitive() { let query = "duct"; let contents = "\ Rust: safe, fast, productive. Pick three. Duct tape."; // 期望返回大小寫敏感的匹配結(jié)果 assert_eq!(vec!["safe, fast, productive."], search(query, contents)); } // 測(cè)試:不區(qū)分大小寫的搜索 #[test] fn case_insensitive() { let query = "rUsT"; // 查詢字符串的大小寫不一致 let contents = "\ Rust: safe, fast, productive. Pick three. Trust me."; // 期望返回不區(qū)分大小寫的匹配結(jié)果 assert_eq!( vec!["Rust:", "Trust me."], search_case_insensitive(query, contents) ); } }
在上述代碼中:
case_sensitive
測(cè)試驗(yàn)證了原始的區(qū)分大小寫的搜索。case_insensitive
測(cè)試驗(yàn)證了我們將在后面實(shí)現(xiàn)的不區(qū)分大小寫的搜索。此時(shí),由于我們還沒(méi)有實(shí)現(xiàn)search_case_insensitive
函數(shù),編譯將失敗。
步驟 2:實(shí)現(xiàn) search_case_insensitive 函數(shù)
為了實(shí)現(xiàn)不區(qū)分大小寫的搜索,我們需要修改 search
函數(shù),使其能夠忽略大小寫。
以下是 search_case_insensitive
函數(shù)的實(shí)現(xiàn):
// 不區(qū)分大小寫的搜索函數(shù) pub fn search_case_insensitive<'a>( query: &str, // 查詢字符串 contents: &'a str, // 文件內(nèi)容 ) -> Vec<&'a str> { let query = query.to_lowercase(); // 將查詢字符串轉(zhuǎn)換為小寫 let mut results = Vec::new(); // 存儲(chǔ)匹配結(jié)果 // 遍歷文件中的每一行 for line in contents.lines() { // 將每一行轉(zhuǎn)換為小寫再進(jìn)行比較 if line.to_lowercase().contains(&query) { results.push(line); // 如果匹配,加入結(jié)果列表 } } results // 返回匹配的行 }
代碼解釋:
query.to_lowercase()
將查詢字符串轉(zhuǎn)換為小寫,以確保不區(qū)分大小寫地進(jìn)行匹配。line.to_lowercase()
將每一行內(nèi)容轉(zhuǎn)換為小寫,并檢查是否包含查詢字符串。
步驟 3:修改 run 函數(shù)
run
函數(shù)是程序的核心,它負(fù)責(zé)執(zhí)行搜索并輸出結(jié)果。我們需要修改 run
函數(shù),使其根據(jù) Config
結(jié)構(gòu)體中的 ignore_case
字段來(lái)決定是使用區(qū)分大小寫的 search
函數(shù),還是不區(qū)分大小寫的 search_case_insensitive
函數(shù)。
// 根據(jù)配置運(yùn)行搜索 pub fn run(config: Config) -> Result<(), Box<dyn Error>> { let contents = fs::read_to_string(config.file_path)?; // 讀取文件內(nèi)容 // 根據(jù) ignore_case 字段決定使用哪種搜索 let results = if config.ignore_case { search_case_insensitive(&config.query, &contents) // 不區(qū)分大小寫的搜索 } else { search(&config.query, &contents) // 區(qū)分大小寫的搜索 }; // 打印匹配的行 for line in results { println!("{line}"); } Ok(()) }
代碼解釋:
Config
結(jié)構(gòu)體包含一個(gè)ignore_case
字段,用于控制是否啟用不區(qū)分大小寫的搜索。- 根據(jù)
ignore_case
的值,我們決定調(diào)用search
還是search_case_insensitive
。
步驟 4:獲取環(huán)境變量
現(xiàn)在,我們需要從環(huán)境變量中獲取 IGNORE_CASE
的值,來(lái)決定是否啟用不區(qū)分大小寫的搜索。
我們使用 Rust 標(biāo)準(zhǔn)庫(kù)中的 env
模塊來(lái)訪問(wèn)環(huán)境變量。
use std::env; impl Config { // 構(gòu)建 Config 實(shí)例 pub fn build(args: &[String]) -> Result<Config, &'static str> { if args.len() < 3 { return Err("not enough arguments"); } let query = args[1].clone(); let file_path = args[2].clone(); // 檢查環(huán)境變量 IGNORE_CASE 是否設(shè)置 let ignore_case = env::var("IGNORE_CASE").is_ok(); // 如果環(huán)境變量存在,則啟用不區(qū)分大小寫的搜索 Ok(Config { query, file_path, ignore_case, }) } }
代碼解釋:
- 我們使用
env::var("IGNORE_CASE").is_ok()
來(lái)檢查環(huán)境變量IGNORE_CASE
是否被設(shè)置。 - 如果設(shè)置了該環(huán)境變量,我們將
ignore_case
設(shè)置為true
,否則默認(rèn)為false
。
步驟 5:運(yùn)行程序
現(xiàn)在,我們的程序已經(jīng)支持根據(jù)環(huán)境變量來(lái)控制搜索模式。你可以通過(guò)以下命令來(lái)運(yùn)行程序:
- 不使用環(huán)境變量,執(zhí)行區(qū)分大小寫的搜索:
$ cargo run -- to poem.txt
- 設(shè)置環(huán)境變量
IGNORE_CASE=1
,啟用不區(qū)分大小寫的搜索:
$ IGNORE_CASE=1 cargo run -- to poem.txt
對(duì)于 PowerShell 用戶,可以使用以下命令:
PS> $Env:IGNORE_CASE=1; cargo run -- to poem.txt
總結(jié)
通過(guò)使用環(huán)境變量,我們成功地在Rust程序中實(shí)現(xiàn)了不區(qū)分大小寫的搜索功能。
這種方式讓用戶可以通過(guò)簡(jiǎn)單的環(huán)境變量配置來(lái)改變程序的行為,而不需要每次運(yùn)行程序時(shí)都指定命令行參數(shù)。
通過(guò)這種方法,我們可以在命令行工具中靈活地控制不同的搜索模式,使程序更加友好和易于配置。
在本教程中,我們:
- 通過(guò) TDD 編寫了失敗的測(cè)試,并逐步實(shí)現(xiàn)了功能。
- 學(xué)會(huì)了如何使用 Rust 標(biāo)準(zhǔn)庫(kù)中的
env
模塊獲取環(huán)境變量。 - 通過(guò)環(huán)境變量控制程序行為,讓命令行工具更加靈活。
通過(guò)這個(gè)示例,希望你對(duì) Rust 中如何使用環(huán)境變量有所了解,并能夠在自己的項(xiàng)目中靈活應(yīng)用。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Rust如何使用Sauron實(shí)現(xiàn)Web界面交互
Sauron?是一個(gè)多功能的?Web?框架和庫(kù),用于構(gòu)建客戶端和/或服務(wù)器端?Web?應(yīng)用程序,重點(diǎn)關(guān)注人體工程學(xué)、簡(jiǎn)單性和優(yōu)雅性,這篇文章主要介紹了Rust使用Sauron實(shí)現(xiàn)Web界面交互,需要的朋友可以參考下2024-03-03Rust語(yǔ)言開發(fā)環(huán)境搭建詳細(xì)教程(圖文教程)
本文主要介紹了rust編程語(yǔ)言在windows上開發(fā)環(huán)境的搭建方法,文中通過(guò)圖文的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法
在 Rust 中, 如果一個(gè)類型實(shí)現(xiàn)了 Iterator, 那么它會(huì)被同時(shí)實(shí)現(xiàn) IntoIterator, 具體邏輯是返回自身, 因?yàn)樽陨砭褪堑?這篇文章主要介紹了Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法,需要的朋友可以參考下2023-12-12libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例
這篇文章主要為大家介紹了libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12