2015-01-10 3 views
1

Я хотел бы создать новый вектор, содержащий объекты, которые реализуют Trait, из некоторых векторов, которые у меня уже есть, которые содержат эти объекты.Как создать новый вектор Trait из векторов типов, реализующих Trait?

trait Foo { 
    // 
} 


struct Bar { 
    i: i32, 
} 


struct Baz { 
    c: char, 
} 

impl Foo for Bar { 
    // 
} 

impl Foo for Baz { 
    // 
} 
fn main() { 
    let v1 = vec![Bar{i: 2},Bar{i: 4}]; 
    let v2 = vec![Baz{c: '2'},Baz{c: '4'}]; 

    let mut v_all: Vec<Box<Foo>> = Vec::new(); 

    v_all.extend(v1.into_iter()); 
    v_all.extend(v2.into_iter()); 

} 

Это, конечно, заставляет меня

<anon>:34:11: 34:33 error: type mismatch resolving `<collections::vec::IntoIter<Bar> as core::iter::Iterator>::Item == Box<Foo>`: expected struct Bar, found box 
<anon>:34  v_all.extend(v1.into_iter()); 

Как я мог бы достичь этого, если это возможно?

ответ

3

Ну, если у вас есть Bar, и вам нужен Box<Foo>, то вам нужно первое поле значение, а затем привести его к черту объект, который выглядит следующим образом:

v_all.extend(v1.into_iter().map(|e| Box::new(e) as Box<Foo>)); 
v_all.extend(v2.into_iter().map(|e| Box::new(e) as Box<Foo>)); 
Смежные вопросы