Как принять Vec<Option<T>>
, где T
не может быть скопирован и разворачиваться все значения Some
? Я столкнулся с ошибкой cannot move out of borrowed content
, когда в шаге map
. Я счастлив переместить право собственности на исходный список и «выбросить» None
с.Преобразовать список опций <T> в список T, если T не может быть скопирован
#[derive(Debug)]
struct Uncopyable {
val: u64
}
fn main(){
let num_opts : Vec< Option<Uncopyable> > = vec![Some(Uncopyable{val: 1}),
Some(Uncopyable{val: 2}),
None,
Some(Uncopyable{val: 4})];
let nums : Vec<Uncopyable> = num_opts.iter().filter(|x| x.is_some()).map(|&x| x.unwrap()).collect();
println!("nums: {:?}", nums);
}
Что дает ошибку
<anon>:12:79: 12:81 error: cannot move out of borrowed content
<anon>:12 let nums : Vec<Uncopyable> = num_opts.iter().filter(|x| x.is_some()).map(|&x| x.unwrap()).collect();
Вы можете увидеть здесь: манеж http://is.gd/HCtGZT
Это даже лучше, чем мое решение (если вы не хотите сохранить исходный вектор - вы не можете иметь оба). Обратите внимание, что вы все равно можете использовать 'filter_map', чтобы сделать его короче – llogiq
@llogiq: мне непонятно, может ли Uncopyable использовать не-Clone; поэтому OP может принять решение, использующее '.cloned()'. Спасибо за отличный 'filter_map'. –
Добро пожаловать. Спасибо за 'in_iter()'. – llogiq