2016-11-25 2 views
0

Ich habe eine struct ein veränderliches Referenz enthält (MyStruct2), die ich klonen müssen, so abgeleitete ich die Clone Methode für das struct:Wie struct mit einem veränderlichen Referenz klonen

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

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

Wenn jedoch I kompilieren Diesen Code bekomme ich folgende Fehlermeldung:

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 

Wenn ich die Referenz unveränderlich mache, dann kompiliert der Code.

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

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

Es scheint, dass, obwohl Klon für die MyStruct Struktur abgeleitet ist, ist es nicht für einen veränderbaren Bezug auf MyStruct abgeleitet wird.

Gibt es eine Möglichkeit, einen veränderbaren Verweis auf eine Struktur zu klonen und eine Struktur zu klonen, die eine veränderbare Referenz enthält?

+0

Ich würde vorschlagen, dass Sie [* The Rust Programmiersprache * Kapitel über Referenzen] lesen (https://doc.rust-lang.org/stable/book/references-and-borrowing.html#the-rules). Es ist * entscheidend * wichtig, dass Sie die Einschränkung für veränderbares Aliasing verstehen. – Shepmaster

Antwort

6

Es ist möglich, multiple non-mutable references für dieselbe Ressource zu verwenden. So in dem Code, der kompiliert, werden Sie zwei Verweise auf die gleichen MyStruct erhalten, wenn MyStruct2 geklont .:

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

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

Es ist jedoch nur möglich ist, eine einzige änderbare Referenz auf eine Ressource zu haben. Es ist also nicht möglich, Clone für MyStruct2 automatisch zu implementieren. Sie können es selbst implementieren, es wird wie folgt aussehen:

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

Aber Sie können noch nicht zwei wandelbar Verweise auf die gleiche MyStruct haben. Sie können auch keinen Klon von MyStruct erstellen, der lange genug lebt, um in der Klonfunktion zurückzukehren. Sie müssten also Ihre Datenstruktur ändern, um dies zu ermöglichen.

Verwandte Themen