Bu örnekte neden n1_mut
hala geçerli? Option::Some
'a taşındı, bu yüzden geçersiz olmamalı mı?İşaretçi hareket ettirildikten sonra neden bir işaretçiye üye atamak hala geçerli?
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));
}
şu tanıdık "taşındı değerin kullanılması" ile derleme değil
hata: Bir işaretçi veya olmasın olmak ilgisi yoktur
#[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
İlginç. Bunun bir hata olarak sayılmayacağından emin değilim - daha sonra hafızayı okumak için bir yol olmadığından emin olmadığınıza eminim. Ancak, ham bir işaretçiyi yığına tutturursanız, 'n1Mut.next' öğesinin gerçekten ayarlandığını söyleyebilirsiniz: https://play.rust-lang.org/?gist=d41422bfd142c289667e7c2fb3183be0&version=undefined – trentcl
İlginçtir ki, bu bile mümkün değildir. sonra 'n1_mut.next' kullanın. Ayrıca, bir 'Drop' uygulamasının eklenmesi:" error [E0383]: başlatılmamış yapının "n1_mut" kısmının kısmi yeniden başlatılmasıdır. –