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

5
我有两个名称、字段(和字段类型)完全相同的结构体,它们位于不同的模块中。这些结构体是由一个派生宏构建的,我想要轻松地将其中一个转换为另一个。
例如:
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()方法中编写来自两个结构体的所有字段。有没有什么方法可以在不需要所有关联样板文件的情况下实现这一点?


你能详细介绍一下那个派生宏吗?或者提供一个最小可重现示例吗? - Denys Séguret
如何避免不同结构体中具有语义相等的字段/属性的代码重复?(https://dev59.com/3lkS5IYBdhLWcg3wzZXB);是否有将类似结构体之间的字段移动的语法?(https://dev59.com/7lUL5IYBdhLWcg3wCEIA) - Shepmaster
@DenysSéguret 这些是由 graphql-client crate 构建的结构体。它为每个查询创建结构体,但在我的情况下,我正在使用一个片段来处理所有查询,因此生成的结构体都是相同的。 - Javier Arias
1
相关: https://github.com/graphql-rust/graphql-client/issues/312 但看起来他们没有解决重构问题。 - Denys Séguret
谢谢@DenysSéguret - 我之前看到过这个问题,但是忽略了描述中提出的解决方法,它确实起到了作用。 - Javier Arias
显示剩余5条评论
1个回答

5
似乎在实现类似于此项之前,唯一实现此转换的方式是串行化。
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()
    }
}

源码


1
使用serde_json :: Value作为中间类型更有效-请参见此答案以获取示例。 - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接