Rust 在 env::Args 上使用迭代器方法会产生错误,也许是一个错误?

问题描述

我一直在阅读 Rust 文档,并完成了第 13 章。我更新了 minigrep 程序以在 Config 结构中使用迭代器。现在我正在尝试使用迭代器重新实现命令行参数。

我想做的是使用迭代器解析命令行参数。项目代码

    pub fn new(mut args: env::Args) -> Result<Config,&'static str> {
        args.next();
        
        let query = match args.next() {
            Some(arg) => arg,None => return Err("No query string"),};
        
        let filename = match args.next() {
            Some(arg) => arg,None => return Err("No Filename"),};
        // --snip--
    }

如果参数不存在,我需要将第一个迭代器与可选的命令行参数“-c”进行比较,而不消耗迭代器。

我尝试的第一件事是 args.eq([String::from("-c")].iter());

但是得到了错误 no implementation for `String == &String

接下来我尝试使用 args.copied().collect(); 得到错误 expected struct `String`,found reference 错误

然后我尝试了 args.map(|x: &String| x).collect(); 并获得了 expected signature of `fn(String) -> _` 错误

我也尝试过其他方法,例如:by_ref,peekable,and cloned

我的问题是:

如何在不消耗迭代器的情况下将 env::Args 的第一个迭代器项与字符串进行比较?

解决方法

如何在不消耗迭代器的情况下将 env::Args 的第一个迭代器项与字符串进行比较?

您可能想要使用 Iterator::peekable,它将您的原始迭代器包装到一个提供方法 peek 的迭代器中。该方法在不推进(或消耗)迭代器的情况下返回对下一项的引用!

let mut it = args.peekable();
if it.peek().map(|s| s.as_str()) == Some("-a") {
    
}

由于 it.peek() 返回 Option<&String>,我也将其映射到 s.as_str() 以便能够轻松将其与 Some("-a") 进行比较,而无需为 { 分配 String {1}}。