ich Schwierigkeiten haben, einen Funktionscode zu schreiben, die einen Iterator nimmt und gibt einen Iterator, dass in Iterierten Paare (Option<T>, T)
wie soImplementieren Sie eine paarweise Iterator
a = [1,2,3]
assert pairwise(a) == `[(None, 1), (Some(1), 2), (Some(2), 3)]
fn pairwise<I, T>(&xs: &I) -> I
where
I: Iterator<Item = T>,
{
[None].iter().chain(xs.iter().map(Some)).zip(xs.iter())
}
fn main() {
let data: Vec<i32> = vec![1, 2, 3];
let newdata: Vec<Option<i32>, i32> = pairwise(&data).collect();
println!("{:?}", newdata);
}
error[E0599]: no method named `iter` found for type `I` in the current scope
--> src/main.rs:3:28
|
3 | [None].iter().chain(xs.iter().map(Some)).zip(xs.iter())
| ^^^^
|
nicht sicher, warum xs
nicht ist iterierbar. Ich habe es in der where
Klausel angegeben habe ich nicht?
'.iter()' ist zum Erstellen eines Iterators, aber Sie haben bereits einen. 'xs' ist bereits ein' Iterator'. – loganfsmyth
@loganfsmyth Oh, okay. Was ist der Typ für etwas, das '.iter()' Methode hat? – user1685095
Ich glaube nicht, dass es einen gibt. Es gibt jedoch einen 'IntoIterator', der die' into_iter() 'Methode definiert. Dies wird automatisch für alle Iteratoren implementiert. Wenn Sie also eine API haben, die einen IntoIterator akzeptiert und Sie das Argument nicht konsumieren wollen, kann der Aufrufer einfach '.iter()' selbst aufrufen und übergeben der resultierende Iterator. –