Rust中Box包装的Trait对象使用涡轮鱼语法编译报错问题咨询
问题原因解释
1. Box::new 的隐式约束
Rust中所有泛型参数默认自带Sized约束,Box<T>的new关联函数定义对应逻辑如下:
impl<T> Box<T> { // 泛型T默认隐含Sized约束,只有Sized类型才能调用new pub fn new(x: T) -> Self { /* 实现逻辑 */ } }
dyn Write是trait对象,属于不定长类型,不满足Sized约束,因此Box::<dyn Write>不存在new方法,这是报错的核心原因。
2. 无涡轮鱼写法编译通过的逻辑
你没有显式指定泛型参数时,编译器会先根据你传入的参数做推导:你传入的是File类型的实例,因此先推导T = File,调用Box::<File>::new()得到Box<File>类型的返回值,之后再通过Rust内置的不定长类型转换(Unsized Coercion),将实现了Write trait的Box<File>自动转换为Box<dyn Write>,整个流程都满足约束,所以编译正常。
3. 涡轮鱼写法的正确用法
如果你一定要使用涡轮鱼语法显式指定泛型参数,需要指定的是实际传入的Sized类型,而不是目标trait对象类型:
let a : Box<dyn Write> = Box::<File>::new(File::open("/dev/null").unwrap());
该写法可以正常编译。
内容的提问来源于stack exchange,提问作者Nubarke
相关产品推荐
相关产品推荐

