gpt4 book ai didi

rust - 每次您想使用它时,克隆一个无法实现 Copy 的自定义结构是最好的方法吗?

转载 作者:行者123 更新时间:2023-11-29 08:05:24 26 4
gpt4 key购买 nike

我有一个结构,它有一个 Vec 字段并且无法实现 Copy:

#[derive(Clone, Debug)]
struct MyStruct {
field: Vec<i32>,
}

impl MyStruct {
fn new () -> MyStruct {
MyStruct {
field: vec![1, 2],
}
}

fn overwrite(&mut self, strt: MyStruct) {
self.field = strt.field;
}
}

如果我以后想在我的代码中多次使用它,我必须每次都clone()它:

fn main() {
let mut s = MyStruct::new();
let s2 = MyStruct::new();

s.overwrite(s2.clone());

println!("{:?}", s2);
}

这工作正常,但这是完成此任务的最佳方法吗?还有其他更惯用的方法吗?

最佳答案

让我们回顾一下我们的数据处理故事:

  • 移动是关于转移所有权,因为不再需要原来的变量
  • 克隆就是创建一个副本,以便能够独立使用原始值和新值
  • borrowing 是关于在受控的时间内临时借出一个引用,以便能够在之前和之后使用原始变量(并且可能,如果借用 & 而不是 &mut ,在有限的方式)

在您的情况下,您应该在此处使用借用

fn overwrite(&mut self, strt: &MyStruct) {
// ^
self.field = strt.field.clone();
}

fn main() {
let mut s = MyStruct::new();
let s2 = MyStruct::new();

s.overwrite(&s2);
// ^

println!("{:?}", s2);
}

要深入了解这个概念,请阅读 the Rust Book 。如果您有垃圾收集语言背景,那么第 4.7 到 4.10 章真的是必读的。

关于rust - 每次您想使用它时,克隆一个无法实现 Copy 的自定义结构是最好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35941697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com