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

Rust using iterators methods on env::Args gives errors, maybe a bug?

我一直在阅读 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) -> _` Bug?

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

我的问题是:

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

How can I compare the first iterator item of an env::Args to a string without consuming the iterator?

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

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

因为 it.peek() returns Option<&String>,我也将它映射到 s.as_str() 以便能够轻松地将它与 Some("-a") 进行比较,而无需分配 String 对于 "-a".