Tại sao n1_mut
vẫn hợp lệ trong ví dụ này? Nó đã được chuyển vào Option::Some
vì vậy nó không phải là không hợp lệ?Tại sao việc gán cho một thành viên của một con trỏ vẫn hợp lệ sau khi con trỏ được di chuyển?
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));
}
Sau đây không biên dịch với các "sử dụng các giá trị chuyển" quen thuộc lỗi:
#[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
Thú vị. Không chắc chắn nếu điều này được coi là một lỗi - Tôi không nghĩ rằng bạn có thể gây ra an toàn vì không có cách nào để đọc bộ nhớ sau đó. Nhưng nếu bạn giữ một con trỏ thô vào ngăn xếp, bạn có thể nói rằng 'n1Mut.next' thực sự được thiết lập: https://play.rust-lang.org/?gist=d41422bfd142c289667e7c2fb3183be0&version=undefined – trentcl
Thật thú vị, thậm chí không thể sử dụng 'n1_mut.next' sau. Ngoài ra, thêm một 'Drop' thực hiện nguyên nhân:" lỗi [E0383]: một phần reinitialization của uninitialized cấu trúc 'n1_mut'" –