克隆一个不能在每次使用时实现 Copy 的自定义结构是最好的方法吗?

ehs*_*ird 2 rust

我有一个具有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    s.overwrite(s2.clone());

    println!("{:?}", s2);
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_* M. 5

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

  • 移动是关于转移所有权,因为不再需要原始变量
  • 克隆是关于创建一个副本,以便能够独立使用原始值和新值
  • 借用是关于在受控时间段内临时借出参考,以便能够在之前和之后使用原始变量(并且可能,如果借用&和不借用&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);
}
Run Code Online (Sandbox Code Playgroud)

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