Dlaczego numer n1_mut
jest nadal ważny w tym przykładzie? Zostało przeniesione do Option::Some
, więc czy nie powinno być ono nieważne?Dlaczego przypisywanie do elementu wskaźnika jest nadal poprawne po przeniesieniu wskaźnika?
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));
}
Następujące nie skompilować ze znanego „wykorzystania przeniósł wartości” Błąd:
#[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
Interesujące. Nie jestem pewien, czy to się liczy jako błąd - nie sądzę, że możesz wzbudzić brak bezpieczeństwa, ponieważ nie ma sposobu, aby później odczytać pamięć. Ale jeśli utrzymujesz surowy wskaźnik na stosie, możesz powiedzieć, że 'n1Mut.next' faktycznie się ustawia: https://play.rust-lang.org/?gist=d41422bfd142c289667e7c2fb3183be0&version=undefined – trentcl
Co ciekawe, nie można nawet użyj po 'n1_mut.next'. Dodanie implementacji 'Drop' powoduje:" błąd [E0383]: częściowa reinicjalizacja niezainicjowanej struktury 'n1_mut'" –