Э
Option там не нужен. Он особенно не нужен, если T: Default, потому что можно mem::take сделать и обойтись без unsafe вообще.use std::mem;
pub fn retain_drain<T, F, G>(v: &mut Vec<T>, mut filter: F, mut on_remove: G)
where
T: Default,
F: FnMut(&T) -> bool,
G: FnMut(T),
{
let len = v.len();
let mut del = 0;
{
let v = &mut **v;
for i in 0..len {
let item = &mut v[i];
if !filter(item) {
del += 1;
on_remove(mem::take(item));
} else if del > 0 {
v.swap(i - del, i);
}
}
}
v.truncate(len - del);
}

