如何正确实现From<AsRef<A>> for B?编译报错类型大小无法确定
解决Rust中
From<AsRef<A>>实现的编译错误 问题代码
struct A {} struct B {} impl From<AsRef<A>> for B { fn from(_: AsRef<A>) -> Self { todo!() } }
编译错误
error[E0277]: the size for values of type `(dyn AsRef<address2::A> + 'static)` cannot be known at compilation time --> src/address2.rs:15:6 | 15 | impl From<AsRef<A>> for B { | ^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: the trait `Sized` is not implemented for `(dyn AsRef<address2::A> + 'static)`
错误原因
直接将AsRef<A>作为From的类型参数时,Rust会将其解析为trait 对象dyn AsRef<A>。而 trait 对象属于动态大小类型(DST),编译时无法确定其内存大小,不符合Rust对函数参数(from方法的参数)必须是固定大小类型的要求,因此触发编译错误。
正确实现方式
通过泛型约束,为所有实现了AsRef<A>的具体类型实现From trait,替代直接针对 trait 对象的实现:
struct A {} struct B {} impl<T: AsRef<A>> From<T> for B { fn from(value: T) -> Self { // 可通过 value.as_ref() 获取A的引用进行后续操作 let _a_ref = value.as_ref(); todo!() } }
说明
- 泛型参数
T被约束为AsRef<A>,意味着任何实现了AsRef<A>的类型(比如A本身、&A、Box<A>等)都会自动获得对应的From<T> for B实现。 - 泛型参数
T默认带有Sized约束(Rust泛型的默认规则),确保编译时能确定类型大小,彻底解决原错误中的动态大小问题。
内容的提问来源于stack exchange,提问作者Anon21
相关产品推荐
相关产品推荐

