2017-01-27 7 views
8

मेरे पास Vec<Box<T>> है जहां TFoo लागू करता है। मैं इसे Vec<Box<Foo>> पर क्यों नहीं जोड़ सकता, भले ही मैं Box<T> को Box<Foo> में किसी भी प्रकार का सहारा दे सकता हूं? नीचे कोड संकलित क्यों नहीं करता है?जंग जंगलों को कंटेनरों के अंदर वस्तुओं का पता लगाने की अनुमति क्यों नहीं देती?

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

आपकी रुचियों के लिए प्रासंगिक: एक [कास्ट पर हालिया प्रश्न] (http://stackoverflow.com/questions/41869048/is-there-a-trait-for-scalar-castable-types)। – ljedrz

उत्तर

12

क्योंकि Box<Bar>Box<Foo> तुलना में एक अलग आकार है। एकल मूल्य पर जबरन अनुमति है, लेकिन यहां आपको पूरे वेक्टर का आकार बदलना होगा। पुस्तक Representation of Trait Objects पर अनुभाग में इस पर कुछ विस्तार में जाती है। लघु संस्करण: Box<Bar> एक मूल्य के लिए एक सूचक है। Box<Foo> एक मूल्य और एक सूचक के लिए एक सूचक है जो एक सूचक के लिए एक सूचक है।

+0

आह, मैं देखता हूं। धन्यवाद! –

संबंधित मुद्दे