[英]How can I iterate over a sequence multiple times within a function?
我有一个 function 我想接受一个可以循环的参数。 但是我想循环两次。 我尝试使用Iterator
特征,但是我只能迭代它一次,因为它在迭代时会消耗结构。
我应该怎么做才能让我的 function 循环两次? 我知道我可以使用values: Vec<usize>
但是我想让它在任何可迭代的 object 上通用。
这是我想做的一个例子:(请忽略循环实际上在做什么。在我的真实代码中,我无法将两个循环压缩为一个。)
fn perform<'a, I>(values: I) -> usize
where
I: Iterator<Item = &'a usize>,
{
// Loop one: This works.
let sum = values.sum::<usize>();
// Loop two: This doesn't work due to `error[E0382]: use of moved value:
// `values``.
let max = values.max().unwrap();
sum * max
}
fn main() {
let v: Vec<usize> = vec![1, 2, 3, 4];
let result = perform(v.iter());
print!("Result: {}", result);
}
您不能对同一个迭代器进行两次迭代,因为不能保证迭代器可以随机访问。 例如, std::iter::from_fn
产生一个绝对不能随机访问的迭代器。
正如@mousetail 已经提到的,解决这个问题的一种方法是期待一个能够Clone
的迭代器:
fn perform<'a, I>(values: I) -> usize
where
I: Iterator<Item = &'a usize> + Clone,
{
// Loop one: This works.
let sum = values.clone().sum::<usize>();
// Loop two: This doesn't work due to `error[E0382]: use of moved value:
// `values``.
let max = values.max().unwrap();
sum * max
}
fn main() {
let v: Vec<usize> = vec![1, 2, 3, 4];
let result = perform(v.iter());
println!("Result: {}", result);
}
Result: 40
尽管在您的具体示例中,我会在同一迭代中同时计算sum
和max
:
fn perform<'a, I>(values: I) -> usize
where
I: Iterator<Item = &'a usize>,
{
let (sum, max) = values.fold((0, usize::MIN), |(sum, max), &el| {
(sum + el, usize::max(max, el))
});
sum * max
}
fn main() {
let v: Vec<usize> = vec![1, 2, 3, 4];
let result = perform(v.iter());
println!("Result: {}", result);
}
Result: 40
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.