如何在不复制所有成员的情况下将rust结构体“强制转换”为另一个相同的类型(相同的字段/布局)

jvidinwx  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(60)

我在一个模块中有一个私有类型,它与另一个类型具有相同的字段。我不能相互导入(以某种方式共享类型),因为这将导致循环依赖,并且重构以允许这种情况将非常复杂。
为了清楚起见,两个模块中的结构体看起来都是这样的:

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
}
c9x0cxw0

c9x0cxw01#

如果Args和mod 2::Args相同(相同的字段名,相同的类型),则定义第二个Args不会增加值。
相反,您可以将其命名为:

type MyArgs = mod2::Args;

或者只是把它纳入范围:

use mod2::Args as MyArgs;

然后把它当成自己喜欢的类型
已经说过,有mem::transmute-黑魔法,做什么你问。

相关问题