J'essaie de supprimer certains éléments d'un vecteur, en fonction d'un prédicat, et de collecter le résultat. Voici un (ne fonctionne pas) par exemple avec un résultat attendu:Existe-t-il un moyen de drainer des parties d'un vecteur en fonction d'un prédicat?
let mut v: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
assert_eq!(v, vec![1, 3, 5]);
assert_eq!(drained, vec![2, 4, 6]);
Il en résulte l'erreur
error[E0599]: no method named `drain` found for type `std::iter::Filter<std::slice::Iter<'_, i32>, [[email protected]/main.rs:4:45: 4:62]>` in the current scope
--> src/main.rs:4:64
|
4 | let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
| ^^^^^
Il existe plusieurs alternatives que j'ai regardé, aucun d'entre eux semblent faire ce que je veux:
Vec::retain
supprime les éléments du vecteur, mais ne rend pas la propriété des éléments supprimés.v.drain(..).filter(condition).collect()
renvoie la valeur correcte pourdrained
mais vide le vecteur entier.
avez-vous essayé de convertir le tableau avec to_vec? 'let drained: Vec = filtre v.iter(). (| E | (* e)% 2 == 0) .to_vec(). Drain (..). Collect();' –
aug2uag