如何迭代一片映射切片?

Fix*_*int 3 rust

这是我正在尝试做的一个例子:

for &xs in &[&[1, 2, 3].iter().map(|x| x + 1)] {
    for &x in xs {
        println!("{}", x);
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

error[E0277]: the trait bound `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:2:40: 2:49]>: std::iter::Iterator` is not satisfied
 --> src/main.rs:3:9
  |
3 | /         for &x in xs {
4 | |             println!("{}", x);
5 | |         }
  | |_________^ the trait `std::iter::Iterator` is not implemented for `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:2:40: 2:49]>`
  |
  = note: `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:2:40: 2:49]>` is not an iterator; maybe try calling `.iter()` or a similar method
  = note: required by `std::iter::IntoIterator::into_iter`
Run Code Online (Sandbox Code Playgroud)

......这非常令人惊讶,因为我清楚地看到了如何std::Iter::Map实现Iterator.

为什么会抱怨以及如何迭代一片映射切片?

Vee*_*rac 5

&T不能作为next变异迭代.

因此,如果你有&Map<_, _>,你不能迭代它.

你可能没有意识到这&[1,2,3].iter().map(|&x| x+1)意味着

&([1,2,3].iter().map(|&x| x+1))
Run Code Online (Sandbox Code Playgroud)

给出参考.

使用for &xs in &[&mut ...]也不会起作用,因为它需要xs移出不可变引用.目前在固定长度数组上也没有按值迭代器.我相信最简单的解决方案是

for xs in &mut [&mut [1, 2, 3].iter().map(|&x| x+1)] {
    for x in xs {
        println!("{}", x);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这还需要修复map调用问题,该问题不会取消引用其输入.