2017-01-27 33 views
8

Mam Vec<Box<T>> gdzie T implementuje . Dlaczego nie mogę go przymusić do Vec<Box<Foo>>, mimo że mogę przymusić cokolwiek typu Box<T> do Box<Foo>? Dlaczego poniższy kod nie jest kompilowany?Dlaczego Rust nie pozwala na wymuszanie obiektów w kontenerach?

use std::vec; 

trait Foo {} 

struct Bar {} 

impl Foo for Bar {} 

fn main() { 
    let v = vec![Box::new(Bar {})]; 
    let v_1 = v as Vec<Box<Foo>>; 
} 
+0

Odpowiednie dla twoich zainteresowań: [ostatnie pytanie dotyczące obsady] (http://stackoverflow.com/questions/41869048/is-there-a-trait-for-scalar-castable- typeses). – ljedrz

Odpowiedz

12

Ponieważ Box<Bar> ma inny rozmiar niż Box<Foo>. Przymus jest dozwolony dla pojedynczej wartości , ale tutaj trzeba zmienić rozmiar całego wektora. Książka zawiera szczegółowe informacje na ten temat w sekcji Representation of Trait Objects. Wersja skrócona: Box<Bar> to wskaźnik do wartości. Box<Foo> to wskaźnik do wartości i wskazówka na tabelę vtable.

+0

Ah, rozumiem. Dzięki! –