n1_mut
अभी भी इस उदाहरण में मान्य क्यों है? इसे Option::Some
में स्थानांतरित कर दिया गया है, इसलिए यह अमान्य नहीं होना चाहिए?पॉइंटर के किसी सदस्य को असाइन करना क्यों पॉइंटर स्थानांतरित होने के बाद भी मान्य है?
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));
}
निम्नलिखित परिचित "चले गए मूल्य के उपयोग" के साथ संकलन नहीं करता त्रुटि:
#[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
दिलचस्प। सुनिश्चित नहीं है कि यह एक बग के रूप में गिना जाता है - मुझे नहीं लगता कि आप असुरक्षित प्रेरित कर सकते हैं क्योंकि बाद में स्मृति को पढ़ने का कोई तरीका नहीं है। लेकिन अगर आप स्टैक पर कच्चे पॉइंटर रखते हैं तो आप बता सकते हैं कि 'n1Mut.next' वास्तव में सेट हो जाता है: https://play.rust-lang.org/?gist=d414orgianfd142c289667e7c2fb3183be0&version=undefined – trentcl
दिलचस्प बात यह है कि यहां तक कि संभव नहीं है के बाद 'n1_mut.next' का उपयोग करें। साथ ही, 'ड्रॉप' कार्यान्वयन को जोड़ने का कारण बनता है: "त्रुटि [E0383]: अनियमित संरचना का आंशिक पुनर्नवीनीकरण 'n1_mut'" –