2015-06-20 89 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