我有以下函数,它应该在给定 Iterator
的情况下查找并返回 String
的最长长度:
fn max_width(strings: &Iterator<Item = &String>) -> usize {
let mut max_width = 0;
for string in strings {
if string.len() > max_width {
max_width = string.len();
}
}
return max_width;
}
但是,编译器给我以下错误:
error[E0277]: the trait bound `&std::iter::Iterator<Item=&std::string::String>: std::iter::Iterator` is not satisfied
--> src/main.rs:3:19
|
3 | for string in strings {
| ^^^^^^^ `&std::iter::Iterator<Item=&std::string::String>` is not an iterator; maybe try calling `.iter()` or a similar method
|
= help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Iterator<Item=&std::string::String>`
= note: required by `std::iter::IntoIterator::into_iter`
我是 Rust 的新手,对此感到非常困惑,因为我认为我是在显式传递一个迭代器。调用 strings.iter()
告诉我它没有实现,调用 strings.into_iter()
让我掉进了一个可变性的兔子洞,我当然不会想要改变传递的参数。
如何遍历我的字符串?
最佳答案
您的代码失败,因为 Iterator
与 &Iterator
不同。如果您将 Iterator
传递给您的函数,您可以解决此问题,但由于 Iterator
是一个特征,因此无法确定大小(您不知道,什么 Iterator
你正在通过)。解决方案是传递任何实现 Iterator
的东西:
fn max_width<'a>(strings: impl Iterator<Item = &'a String>) -> usize
对于更有经验的 Rust 用户:
最通用的方式大概是这样的:
fn max_width<T: AsRef<str>>(strings: impl IntoIterator<Item = T>) -> usize {
let mut max_width = 0;
for string in strings {
let string = string.as_ref();
if string.len() > max_width {
max_width = string.len();
}
}
max_width
}
但是,您也可以使用
fn max_width<T: AsRef<str>>(strings: impl IntoIterator<Item = T>) -> usize {
strings
.into_iter()
.map(|s| s.as_ref().len())
.max()
.unwrap_or(0)
}
关于rust - 为什么我不能将 `&Iterator<Item = &String>` 用作迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51758485/