问题描述
我一直在阅读 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}}。