Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 正在克隆可以';您是否希望在每次使用拷贝时都实现拷贝—这是实现拷贝的最佳方式?_Rust - Fatal编程技术网

Rust 正在克隆可以';您是否希望在每次使用拷贝时都实现拷贝—这是实现拷贝的最佳方式?

Rust 正在克隆可以';您是否希望在每次使用拷贝时都实现拷贝—这是实现拷贝的最佳方式?,rust,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: MyS

我的结构有一个
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;
    }
}

这很好,但这是完成这项任务的最佳方式吗?还有其他更惯用的方法吗?

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

  • 移动是关于转移所有权,因为原始变量不再是必需的
  • 克隆是指创建一个副本,以便能够独立使用原始值和新值
  • 借用是指在受控的时间内临时借用一个引用,以便能够在前后使用原始变量(如果借用时使用
    &
    ,而不是
    &mut
    ,则可能在使用期间以有限的方式借用)
在你的情况下,你应该在这里借用


要深入了解该概念,请阅读。如果你来自垃圾收集的语言背景,那么第4.7章到第4.10章确实是必读的。

这太模糊了,说不出什么是惯用语。为什么您需要以这种方式覆盖数据,为什么您需要保留数据源(在您的示例中为s2)?我同意Sebastian Redl的观点-如果您必须转移所有权,但仍然保持所有权,那么您唯一的解决方案就是克隆(或复制)项目。也许你不需要转让所有权,可以使用参考资料。也许您可以使用共享所有权,例如
Rc
Arc
。让mut s似乎没有给示例添加任何内容。。。也许复制粘贴中丢失了什么?@Shepmaster我的问题纯粹是理论上的,这个例子只是为了说明我的意思。我在检查我的代码时注意到,我有很多无法实现复制的结构,有时我不得不调用许多在同一个结构上使用该结构的方法。用20行代码克隆同一个结构似乎有点难看。也许你是对的,我的问题太模糊了。谢谢。我读过这本书,有时仍然感到困惑。顺便说一句,您编写的代码仍然会给出借用的内容错误@
self.field=strt.field
@ehsisthatswerd:oopsie,当然必须克隆
字段本身:)
fn main() {
    let mut s = MyStruct::new();
    let s2 = MyStruct::new();

    s.overwrite(s2.clone());

    println!("{:?}", s2);
}
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);
}