我有一个包含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
.
有没有办法克隆对结构的可变引用并克隆包含可变引用的结构?
可以对同一资源进行多次非可变引用.因此,在编译的代码中,克隆MyStruct
时将获得两个相同的引用MyStruct2
:
#[derive(Clone)]
struct MyStruct {
val: usize,
}
#[derive(Clone)]
struct MyStruct2<'a> {
struct_reference: &'a MyStruct
}
Run Code Online (Sandbox Code Playgroud)
但是,只能对资源进行单个可变引用.因此,它是不可能自动实现Clone
的MyStruct2
.你可以自己实现它,它看起来像这样:
impl<'a> Clone for MyStruct2<'a> {
fn clone(&self) -> MyStruct2<'a> {
// your code here
}
}
Run Code Online (Sandbox Code Playgroud)
但是你仍然不能有两个相同的可变引用MyStruct
.您也无法创建一个克隆,MyStruct
其生命周期足以在克隆函数中返回.因此,您必须修改数据结构才能实现此目的.