繁体   English   中英

如何在 function 中多次迭代序列?

[英]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

尽管在您的具体示例中,我会在同一迭代中同时计算summax

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM