2017-01-27 18 views
8

Tôi có một số Vec<Box<T>> trong đó T triển khai Foo. Tại sao tôi không thể ép nó vào một số Vec<Box<Foo>> mặc dù tôi có thể ép buộc bất kỳ điều gì thuộc loại Box<T> vào một số Box<Foo>? Tại sao mã dưới đây không biên dịch?Tại sao Rust không cho phép cưỡng chế để tính các đối tượng bên trong các vùng chứa?

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

Có liên quan đến sở thích của bạn: [câu hỏi gần đây về phôi] (http://stackoverflow.com/questions/41869048/is-there-a-trait-for-scalar-castable-types). – ljedrz

Trả lời

12

Box<Bar> có kích thước khác với Box<Foo>. Việc ép buộc được cho phép trên giá trị đơn lẻ, nhưng ở đây bạn phải thay đổi kích thước toàn bộ vectơ. Cuốn sách đi vào một số chi tiết về điều này trong phần trên Representation of Trait Objects. Phiên bản ngắn: Box<Bar> là một con trỏ đến một giá trị. Box<Foo> là con trỏ đến giá trị con trỏ đến vtable.

+0

Ah, tôi hiểu rồi. Cảm ơn! –

Các vấn đề liên quan