Próbuję usunąć niektóre elementy z wektora, na podstawie predykatu i zbierając wynik. Oto (nie działa) przykład z oczekiwanego rezultatu:Czy istnieje sposób drenażu części wektora na podstawie predykatu?
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]);
Skutkuje to błędem
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();
| ^^^^^
Istnieje kilka alternatywnych Spojrzałem na żaden z nich nie wydaje się robić to, co chcę:
Vec::retain
usuwa elementy z wektora, ale nie oddać własność usuniętych elementów.v.drain(..).filter(condition).collect()
zwraca poprawną wartość dladrained
, ale opróżnia cały wektor.
masz próbował konwersji tablicy z to_vec? 'niech osuszone: Vec = v.iter(). Filter (| e | (* e)% 2 == 0) .to_vec(). Drain (..). Collect();' –
aug2uag