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"
.
我一直在阅读 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"
.