如何使用可变引用克隆结构体

6

我有一个包含可变引用(MyStruct2)的结构体需要克隆,因此我为该结构体派生了Clone方法:

#[derive(Clone)]
struct MyStruct {
    val: usize,
}

#[derive(Clone)]
struct MyStruct2<'a> {
    struct_reference: &'a mut MyStruct
}

然而,当我编译这段代码时,出现了以下错误信息:
src/main.rs:419:3: 419:37 error: the trait `core::clone::Clone` is not implemented for the type `&mut MyStruct` [E0277]
src/main.rs:419         struct_reference: &'a mut MyStruct
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:417:11: 417:16 note: in this expansion of #[derive_Clone] (defined in src/main.rs)
src/main.rs:419:3: 419:37 help: run `rustc --explain E0277` to see a detailed explanation
src/main.rs:419:3: 419:37 help: the following implementations were found:
src/main.rs:419:3: 419:37 help:   <MyStruct as core::clone::Clone>
src/main.rs:419:3: 419:37 note: required by `core::clone::Clone::clone`
error: aborting due to previous error

如果我将引用设为不可变,那么代码就可以编译。

#[derive(Clone)]
struct MyStruct {
    val: usize,
}

#[derive(Clone)]
struct MyStruct2<'a> {
    struct_reference: &'a MyStruct
}

看起来尽管MyStruct结构体已经定义了clone方法,但是对于MyStruct的可变引用并没有定义clone方法。

是否有一种方法可以克隆一个结构体的可变引用以及包含可变引用的结构体呢?


我建议您重新阅读Rust编程语言关于引用的章节。理解可变别名的限制非常重要。 - Shepmaster
1个回答

9

同一个资源可以有多个不可变引用。因此,在编译的代码中,当克隆MyStruct2时,将获得两个对同一MyStruct的引用。

#[derive(Clone)]
struct MyStruct {
    val: usize,
}

#[derive(Clone)]
struct MyStruct2<'a> {
    struct_reference: &'a MyStruct
}

然而,对于一个资源只能有一个可变引用。因此,不可能自动为MyStruct2实现Clone。您可以自己实现,代码如下:

impl<'a> Clone for MyStruct2<'a> {
    fn clone(&self) -> MyStruct2<'a> {
        // your code here
    }
}

但是你仍然不能拥有两个可变引用指向同一个 MyStruct。你也无法创建一个足够长寿的克隆函数来返回 MyStruct 的克隆版本。因此,你需要修改你的数据结构以实现这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接