par paires j'écrire du code problème pour une fonction qui prend un itérateur et retourne un itérateur qui itère par paires (Option<T>, T)
comme siMettre en œuvre un 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())
| ^^^^
|
Je ne sais pas pourquoi xs
n'est pas itérable. Je l'ai déclaré dans la clause where
n'ai-je pas?
'.iter()' est pour créer un itérateur, mais vous en avez déjà un. 'xs' est déjà un' Iterator'. – loganfsmyth
@loganfsmyth Oh, d'accord. Quel est le type pour quelque chose qui a la méthode '.iter()'? – user1685095
Je ne crois pas qu'il y en ait un. Il y a cependant un 'IntoIterator' qui définit la méthode' into_iter() '. Ceci est automatiquement implémenté pour tous les 'Iterator's, donc si vous avez une API qui prend' IntoIterator' et que vous ne voulez pas consommer réellement l'argument, l'appelant peut simplement appeler '.iter()' lui-même et passer l'itérateur résultant. –