19人参与 • 2025-02-26 • rust
我们遵循测试驱动开发(tdd)方法,首先编写一个测试来验证不区分大小写搜索功能。由于我们尚未实现该功能,因此这个测试会失败。
以下是测试代码:
#[cfg(test)] mod tests { use super::*; // 测试:区分大小写的搜索 #[test] fn case_sensitive() { let query = "duct"; let contents = "\ rust: safe, fast, productive. pick three. duct tape."; // 期望返回大小写敏感的匹配结果 assert_eq!(vec!["safe, fast, productive."], search(query, contents)); } // 测试:不区分大小写的搜索 #[test] fn case_insensitive() { let query = "rust"; // 查询字符串的大小写不一致 let contents = "\ rust: safe, fast, productive. pick three. trust me."; // 期望返回不区分大小写的匹配结果 assert_eq!( vec!["rust:", "trust me."], search_case_insensitive(query, contents) ); } }
在上述代码中:
case_sensitive
测试验证了原始的区分大小写的搜索。case_insensitive
测试验证了我们将在后面实现的不区分大小写的搜索。此时,由于我们还没有实现 search_case_insensitive
函数,编译将失败。为了实现不区分大小写的搜索,我们需要修改 search
函数,使其能够忽略大小写。
以下是 search_case_insensitive
函数的实现:
// 不区分大小写的搜索函数 pub fn search_case_insensitive<'a>( query: &str, // 查询字符串 contents: &'a str, // 文件内容 ) -> vec<&'a str> { let query = query.to_lowercase(); // 将查询字符串转换为小写 let mut results = vec::new(); // 存储匹配结果 // 遍历文件中的每一行 for line in contents.lines() { // 将每一行转换为小写再进行比较 if line.to_lowercase().contains(&query) { results.push(line); // 如果匹配,加入结果列表 } } results // 返回匹配的行 }
代码解释:
query.to_lowercase()
将查询字符串转换为小写,以确保不区分大小写地进行匹配。line.to_lowercase()
将每一行内容转换为小写,并检查是否包含查询字符串。run
函数是程序的核心,它负责执行搜索并输出结果。我们需要修改 run
函数,使其根据 config
结构体中的 ignore_case
字段来决定是使用区分大小写的 search
函数,还是不区分大小写的 search_case_insensitive
函数。
// 根据配置运行搜索 pub fn run(config: config) -> result<(), box<dyn error>> { let contents = fs::read_to_string(config.file_path)?; // 读取文件内容 // 根据 ignore_case 字段决定使用哪种搜索 let results = if config.ignore_case { search_case_insensitive(&config.query, &contents) // 不区分大小写的搜索 } else { search(&config.query, &contents) // 区分大小写的搜索 }; // 打印匹配的行 for line in results { println!("{line}"); } ok(()) }
代码解释:
config
结构体包含一个 ignore_case
字段,用于控制是否启用不区分大小写的搜索。ignore_case
的值,我们决定调用 search
还是 search_case_insensitive
。现在,我们需要从环境变量中获取 ignore_case
的值,来决定是否启用不区分大小写的搜索。
我们使用 rust 标准库中的 env
模块来访问环境变量。
use std::env; impl config { // 构建 config 实例 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(); // 检查环境变量 ignore_case 是否设置 let ignore_case = env::var("ignore_case").is_ok(); // 如果环境变量存在,则启用不区分大小写的搜索 ok(config { query, file_path, ignore_case, }) } }
代码解释:
env::var("ignore_case").is_ok()
来检查环境变量 ignore_case
是否被设置。ignore_case
设置为 true
,否则默认为 false
。现在,我们的程序已经支持根据环境变量来控制搜索模式。你可以通过以下命令来运行程序:
$ cargo run -- to poem.txt
ignore_case=1
,启用不区分大小写的搜索:$ ignore_case=1 cargo run -- to poem.txt
对于 powershell 用户,可以使用以下命令:
ps> $env:ignore_case=1; cargo run -- to poem.txt
通过使用环境变量,我们成功地在rust程序中实现了不区分大小写的搜索功能。
这种方式让用户可以通过简单的环境变量配置来改变程序的行为,而不需要每次运行程序时都指定命令行参数。
通过这种方法,我们可以在命令行工具中灵活地控制不同的搜索模式,使程序更加友好和易于配置。
在本教程中,我们:
env
模块获取环境变量。通过这个示例,希望你对 rust 中如何使用环境变量有所了解,并能够在自己的项目中灵活应用。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论