Ich versuche, einige Elemente aus einem Vektor, basierend auf einem Prädikat, zu entfernen und das Ergebnis zu sammeln. Hier ist ein (nicht funktioniert) Beispiel mit einem erwarteten Ergebnis:Gibt es eine Möglichkeit, Teile eines Vektors basierend auf einem Prädikat zu entwässern?
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]);
Dies führt zu dem Fehler
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();
| ^^^^^
Es gibt mehrere Alternativen, die ich sah, keiner von ihnen scheint zu tun, was ich will:
Vec::retain
entfernt die Elemente aus dem Vektor, ist aber nicht das Eigentum an den entfernten Elemente zurück zu geben.v.drain(..).filter(condition).collect()
gibt den korrekten Wert fürdrained
zurück, leert jedoch den gesamten Vektor.
Sie haben versucht, das Array mit to_vec zu konvertieren? 'leave drained: Vec = v.iter(). Filter (| e | (* e)% 2 == 0) .to_vec(). Drain (..). Collect();' –
aug2uag