mirror of https://github.com/KaiserY/trpl-zh-cn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.2 KiB
55 lines
1.2 KiB
use std::cell::RefCell;
|
|
use std::rc::{Rc, Weak};
|
|
|
|
#[derive(Debug)]
|
|
struct Node {
|
|
value: i32,
|
|
parent: RefCell<Weak<Node>>,
|
|
children: RefCell<Vec<Rc<Node>>>,
|
|
}
|
|
|
|
// ANCHOR: here
|
|
fn main() {
|
|
let leaf = Rc::new(Node {
|
|
value: 3,
|
|
parent: RefCell::new(Weak::new()),
|
|
children: RefCell::new(vec![]),
|
|
});
|
|
|
|
println!(
|
|
"leaf strong = {}, weak = {}",
|
|
Rc::strong_count(&leaf),
|
|
Rc::weak_count(&leaf),
|
|
);
|
|
|
|
{
|
|
let branch = Rc::new(Node {
|
|
value: 5,
|
|
parent: RefCell::new(Weak::new()),
|
|
children: RefCell::new(vec![Rc::clone(&leaf)]),
|
|
});
|
|
|
|
*leaf.parent.borrow_mut() = Rc::downgrade(&branch);
|
|
|
|
println!(
|
|
"branch strong = {}, weak = {}",
|
|
Rc::strong_count(&branch),
|
|
Rc::weak_count(&branch),
|
|
);
|
|
|
|
println!(
|
|
"leaf strong = {}, weak = {}",
|
|
Rc::strong_count(&leaf),
|
|
Rc::weak_count(&leaf),
|
|
);
|
|
}
|
|
|
|
println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
|
|
println!(
|
|
"leaf strong = {}, weak = {}",
|
|
Rc::strong_count(&leaf),
|
|
Rc::weak_count(&leaf),
|
|
);
|
|
}
|
|
// ANCHOR_END: here
|