如何使用可变引用来克隆struct

时间:2016-11-25 18:03:36

标签: rust

我有一个包含我需要克隆的可变引用(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派生的,但它似乎不是为MyStruct的可变引用而派生的。

有没有办法克隆对结构的可变引用并克隆包含可变引用的结构?

1 个答案:

答案 0 :(得分:8)

可以将multiple non-mutable references放在同一资源上。因此,在编译的代码中,当克隆MyStruct时,您将获得对同一MyStruct2的两个引用。:

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

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

但是,只能对资源进行单个可变引用。因此,无法为Clone自动实施MyStruct2。你可以自己实现它,它看起来像这样:

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

但是你仍然不能对同一个MyStruct有两个可变引用。 您也无法创建MyStruct的克隆,其长度足以在克隆函数中返回。因此,您必须修改数据结构才能实现这一目标。