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

pdi*_*ley 4 rust

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

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

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

但是,当我编译此代码时,我收到以下错误消息:

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
Run Code Online (Sandbox Code Playgroud)

如果我使引用不可变,那么代码编译.

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

#[derive(Clone)]
struct MyStruct2<'a> {
    struct_reference: &'a MyStruct
}
Run Code Online (Sandbox Code Playgroud)

似乎即使克隆是为结构派生的MyStruct,它也不是为可变引用而派生的MyStruct.

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

wim*_*ica 9

可以对同一资源进行多次非可变引用.因此,在编译的代码中,克隆MyStruct时将获得两个相同的引用MyStruct2:

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

#[derive(Clone)]
struct MyStruct2<'a> {
    struct_reference: &'a MyStruct
}
Run Code Online (Sandbox Code Playgroud)

但是,只能对资源进行单个可变引用.因此,它是不可能自动实现CloneMyStruct2.你可以自己实现它,它看起来像这样:

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

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