我有两个完全相似的 struct A和B.我正在try 将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

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

推荐答案

这通常是通过宏完成的:

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}

Rust相关问答推荐

如何在 struct 中填充缓冲区并同时显示它?

如何优化小型固定大小数组中的搜索?

Rust中的相互递归特性与默认实现

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

什么时候铁 rust FFI边界上的panic 是未定义的行为?

如何模拟/创建ReqData以测试Actix Web请求处理程序?

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

有没有可能让泛型Rust T总是堆分配的?

如何从ruust中的fig.toml中读取?

使用 select 处理 SIGINT 和子等待!无阻塞

从 rust 函数返回 &HashMap

Rust中的一生语法有什么作用?

方法可以被误认为是标准特性方法

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

如何从 x86_64 Mac 构建 M1 Mac?

Rust 将特性传递给依赖项

如何为枚举中的单个或多个值返回迭代器

提取 struct 生成宏中字段出现的索引

返回 &str 但不是 String 时,borrow 时间比预期长