2015-06-20 193 views
3

这里是什么,我试图做一个例子:如何遍历切片映射切片?

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

这给了我下面的错误:

error[E0277]: the trait bound `&std::iter::Map<std::slice::Iter<'_, {integer}>, [[email protected]/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}>, [[email protected]/main.rs:2:40: 2:49]>` 
    | 
    = note: `&std::iter::Map<std::slice::Iter<'_, {integer}>, [[email protected]/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` 

...这是非常令人惊讶的,因为我清楚地看到how std::Iter::Map implements Iterator

它为什么会抱怨以及如何遍历片映射切片?

回答

4

&T不能迭代为next变异。

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

你可能不知道,&[1,2,3].iter().map(|&x| x+1)意味着

&([1,2,3].iter().map(|&x| x+1)) 

给予参考。

使用for &xs in &[&mut ...]也不起作用,因为它需要将xs移出不可变引用。目前还没有定长数组的迭代器。我认为,最简单的方法是

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

注意,这也需要与map调用,也没有提领其输入固定的问题。

+0

谢谢。虽然这不是直接适用于我想要做的事情,但它帮助我将自己的头围绕着Rust的角度围绕着生命周期和所有权。 – Fixpoint