Warum ist in diesem Beispiel n1_mut
noch gültig? Es wurde in Option::Some
verschoben, sollte es nicht ungültig sein?Warum ist die Zuweisung zu einem Mitglied eines Zeigers nach dem Verschieben des Zeigers noch gültig?
struct MyRecordRec2<'a> {
pub id: u32,
pub name: &'a str,
pub next: Box<Option<MyRecordRec2<'a>>>
}
#[test]
fn creating_circular_recursive_data_structure() {
let mut n1_mut = MyRecordRec2 {
id: 1,
name: "n1",
next: Box::new(None)
};
let n2 = MyRecordRec2 {
id: 2,
name: "n2",
next: Box::new(Some(n1_mut))
};
//Why is n1_mut still valid?
n1_mut.next = Box::new(Some(n2));
}
folgendem Grund nicht mit dem bekannten „Verwendung bewegt Wert“ Fehler nicht kompilieren:
#[test]
fn creating_and_freezing_circular_recursive_data_structure() {
let loop_entry = {
let mut n1_mut = MyRecordRec2 {
id: 1,
name: "n1",
next: Box::new(None),
};
let n2 = MyRecordRec2 {
id: 2,
name: "n2",
next: Box::new(Some(n1_mut)),
};
n1_mut.next = Box::new(Some(n2));
n1_mut
};
}
error[E0382]: use of moved value: `n1_mut`
--> src/main.rs:44:9
|
39 | next: Box::new(Some(n1_mut)),
| ------ value moved here
...
44 | n1_mut
| ^^^^^^ value used here after move
|
= note: move occurs because `n1_mut` has type `MyRecordRec2<'_>`, which does not implement the `Copy` trait
Interessant. Ich bin mir nicht sicher, ob das als Fehler gilt - ich glaube nicht, dass Sie Unsicherheiten hervorrufen können, da es keine Möglichkeit gibt, die Erinnerung danach zu lesen. Aber wenn Sie einen rohen Zeiger auf den Stack behalten, können Sie sagen, dass 'n1Mut.next' tatsächlich gesetzt ist: https://play.rust-lang.org/?gist=d41422bfd142c289667e7c2fb3183be0&version=undefined – trentcl
Interessanterweise ist es nicht möglich, sogar benutze 'n1_mut.next' danach. Außerdem fügt das Hinzufügen einer "Drop" -Implementierung Folgendes hinzu: "Fehler [E0383]: teilweise Reinitialisierung der nicht initialisierten Struktur' n1_mut' " –