Rust中的泛型From实现

whhtz7ly  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(141)

我有两个结构体A和B,它们非常相似。我试图将A和B都转换为另一个类型C。A、B和C的定义如下所示。

pub struct A {
   pub a: i32,
}

pub struct B {
   pub a: i32,
}

pub struct C {
   pub b: i32,
}

我的实现转换从A到C如下所示:-

impl From<A> for C { 
  fn from(a: A) -> C {
    C {b: a.a}
  }
}

由于A和B都是相似的,为了将B转换为C,目前我有一个上面定义的From的重复实现。
我正在寻找一种方法,使From实现通用,并且仅限于使用A和B。我的实现如下:

trait Types {}

impl Types for A {}
impl Types for B {}

impl<T: Types> From<T> for C where T: Types {
    fn from(entity: T) -> C {
        C { b: entity.a }
    }
}

但是当我用上面的代码编译一个程序时,我得到了下面的错误,

error[E0609]: no field `a` on type `T`
   |
27 | impl<T: Types> From<T> for C where T: Types {
   |      - type parameter 'T' declared here

我想知道解决这个错误的方法,因为我别无选择,只能保留A和B并避免代码重复。

bzzcjhmw

bzzcjhmw1#

通常这是由宏来完成的:

macro_rules! to_C {
    ($t:ty) => {
        impl From<$t> for C { 
            fn from(a: $t) -> C {
              C{b: a.a}
            }
        }
    };
}

to_C!{A}
to_C!{B}

相关问题