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

Posted

技术标签:

【中文标题】如何将结构转换为具有完全相同字段名称和类型的另一个结构?【英文标题】:How can I convert a struct to another struct with exactly the same field names and types? 【发布时间】:2021-08-14 19:13:19 【问题描述】:

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

例如

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


mod b 
    struct A 
        field1: String,
        field2: String,
    

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

impl From<b::A> for a::A 需要在from() 方法中写入两个结构中的所有字段。如果没有所有相关的样板文件,有什么方法可以实现这一点?

【问题讨论】:

您能详细介绍一下派生宏吗?也许是 MRE? How to avoid code duplication of different structs with semantically equal fields/properties?; Is there syntax for moving fields between similar structs? @DenysSéguret 这些是由graphql-client crate 构造的结构。它为每个查询创建结构,但在我的情况下,我为所有查询使用一个片段,因此生成的结构都是相同的 相关:github.com/graphql-rust/graphql-client/issues/312 但看起来他们并没有设法解决重构问题 谢谢@DenysSéguret - 我以前见过这个问题,但忽略了描述中提出的解决方法,它可以解决问题 【参考方案1】:

似乎在实现this 之类的东西之前,实现这种转换的唯一方法是序列化:

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()
    

Source

【讨论】:

以上是关于如何将结构转换为具有完全相同字段名称和类型的另一个结构?的主要内容,如果未能解决你的问题,请参考以下文章

将列表转换为具有新属性名称的另一个新列表

C# - 将一个类的列表转换为具有相同属性的另一个类的列表[重复]

将C结构转换为具有较少元素的另一个结构是否安全?

如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?

如何选择(所有)表 1 中的一行,该行具有与表 2 相同的另一行

如何将转换后的行汇总并集中到一个具有相同 ID 的字段中?