如何在不复制所有成员的情况下将 rust 结构"cast"为另一种相同的类型(相同的字段/布局)



我在一个模块中有一个私有类型,它与另一个类型具有相同的字段。我不能相互导入(以某种方式共享类型(,因为这将导致循环依赖,并且重构以允许这种依赖将非常复杂。

为了清楚起见,结构在两个模块中都是这样的:

struct Args {
pub a: String,
pub b: String,
pub c: Option<PathBuf>,
}

在某些情况下,我可以";消耗";其中一个项目,所以我将在字段之间执行std::mem::swap

但是,在不可能消费的情况下,我需要发送另一种类型的引用,为了调用函数,创建中间对象并来回交换是很麻烦的

例如,在这样的情况下:

pub struct Args {
pub a: String,
pub b: String,
pub c: Option<PathBuf>
}
fn main() {
let args = crate::Args::default(); // this module Args
crate::work(&args); // works obviously
mod2::mod2_work(&args); // doesn't work
// how to avoid this?
let m2_args = mod2::work::Args { ... } // copy/clone from this args;
mod2::mod2_work(&m2_args); // works
}
fn work(args: &Args) { } // this module args

// module 2 (different but same "Args")
// for the sake of this example assume even the same file
pub mod mod2 {
pub struct Args {
pub a: String,
pub b: String,
pub c: Option<PathBuf>
}
pub fn mod2_work(args: &mod2::Args) { } // module 2 args
}

如果Args和mod2::Args相同(字段名称相同,类型相同(,定义第二Args不增加任何值。

相反,您可以将其别名为:

type MyArgs = mod2::Args;

或者只是纳入范围:

use mod2::Args as MyArgs;

然后把它当作你自己的类型。

话虽如此,有一个mem::transmate-黑魔法,它能满足你的要求。

相关内容

  • 没有找到相关文章

最新更新