首页 > 解决方案 > 如何从 for 循环内的迭代器中获取多个值?

问题描述

我有一个无限迭代器,我想从迭代器打印不同的切片。

因此,如果我在控制台中调用 extract(8,&[1,2,3,4]),我想查看/获取:

1
2 3
4 1 2
3 4 1 2
3 4 1 2 3
4 1 2 3 4 1
2 3 4 1 2 3 4

我的尝试:

fn extract(n: usize, seq: &[u16]) {
    let mut iterator = seq.iter().cycle();

    for it in 1..n {
        iterator.take(it).for_each(|x| print!("{} ", x)); // <- Problem is here
        print!("\n");
    }
}

当我编译时:

warning: variable does not need to be mutable
 --> src/lib.rs:2:9
  |
2 |     let mut iterator = seq.iter().cycle();
  |         ----^^^^^^^^
  |         |
  |         help: remove this `mut`
  |
  = note: `#[warn(unused_mut)]` on by default

error[E0382]: use of moved value: `iterator`
 --> src/lib.rs:5:9
  |
2 |     let mut iterator = seq.iter().cycle();
  |         ------------ move occurs because `iterator` has type `std::iter::Cycle<std::slice::Iter<'_, u16>>`, which does not implement the `Copy` trait
...
5 |         iterator.take(it).for_each(|x| println!("{} ", x));
  |         ^^^^^^^^ value moved here, in previous iteration of loop

我知道迭代器在每次循环迭代中都会改变它的值。这就是为什么我标记为 mutated var。但是不知何故,iteratorvar 被用作函数的参数(我看不到)并且迭代器被移动了。所以在下一个循环迭代中,iteratorvar 超出范围,我得到了移动值错误。

为了更好地理解我的代码:

标签: rustiteratormove-semantics

解决方案


正如其他人所写,take消耗您的迭代器。为避免这种情况,您可以使用by_refwhich 包装原始迭代器,并且可以在不消耗原始迭代器的情况下使用

fn extract(n: usize, seq: &[u16]) {
    let mut iterator = seq.iter().cycle();

    for it in 1..n {
        iterator.by_ref().take(it).for_each(|x| println!("{} ", x));
        print!("\n");
    }
}

推荐阅读