it编程 > 编程语言 > rust

使用环境变量实现Rust程序中的不区分大小写搜索方式

19人参与 2025-02-26 rust

步骤 1:编写失败的测试

我们遵循测试驱动开发(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)
        );
    }
}

在上述代码中:

步骤 2:实现 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 // 返回匹配的行
}

代码解释:

步骤 3:修改 run 函数

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(())
}

代码解释:

步骤 4:获取环境变量

现在,我们需要从环境变量中获取 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,
        })
    }
}

代码解释:

步骤 5:运行程序

现在,我们的程序已经支持根据环境变量来控制搜索模式。你可以通过以下命令来运行程序:

  1. 不使用环境变量,执行区分大小写的搜索:
$ cargo run -- to poem.txt
  1. 设置环境变量 ignore_case=1,启用不区分大小写的搜索:
$ ignore_case=1 cargo run -- to poem.txt

对于 powershell 用户,可以使用以下命令:

ps> $env:ignore_case=1; cargo run -- to poem.txt

总结

通过使用环境变量,我们成功地在rust程序中实现了不区分大小写的搜索功能。

这种方式让用户可以通过简单的环境变量配置来改变程序的行为,而不需要每次运行程序时都指定命令行参数。

通过这种方法,我们可以在命令行工具中灵活地控制不同的搜索模式,使程序更加友好和易于配置。

在本教程中,我们:

通过这个示例,希望你对 rust 中如何使用环境变量有所了解,并能够在自己的项目中灵活应用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Rust的泛型、Traits与生命周期用法及说明

02-26

如何使用Rust的向量存储值列表

02-26

Rust生命周期之验证引用有效性与防止悬垂引用方式

02-26

Rust中的Trait与Trait Bounds详解

02-26

Rust中的注释使用解读

02-26

Rust中的方法与关联函数使用解读

02-26

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论