You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:20:15