如何将一个结构转换为另一个具有完全相同字段名称和类型的结构?

Jav*_*ias 6 struct type-conversion rust

我有两个具有相同名称、字段(和字段类型)的相同结构,它们位于不同的模块中。它们是由派生宏构造的,并且希望轻松地从一种转换为另一种。

例如

mod a {
    struct A {
        field1: String,
        field2: String,
    }
}

mod b {
    struct A {
        field1: String,
        field2: String,
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做let a: a::A = a::A::from(b::A)或类似的事情。

impl From<b::A> for a::A需要在方法中写入两个结构体的所有字段from()。有没有办法在没有所有相关样板的情况下实现这一目标?

Jav*_*ias 6

似乎在实现这样的事情之前,实现这种转换的唯一方法是序列化:

impl From<b::A> for a::A {
    fn from(a: b::A) -> Self {
        let serialised = serde_json::to_string(&a).unwrap();
        serde_json::from_str(&serialised).unwrap()
    }
}
Run Code Online (Sandbox Code Playgroud)

来源

  • 使用 `serde_json::Value` 作为中间类型会更有效 - 有关示例,请参阅[此答案](/sf/answers/4024209591/)。 (2认同)