
185
3
장
주요 개념
struct Branch {
id: BranchId,
leaves: Vec<Rc<RefCell<Leaf>>>,
owner: Option<Weak<RefCell<Tree>>>,
}
struct Leaf {
id: LeafId,
owner: Option<Weak<RefCell<Branch>>>,
}
Weak
레퍼런스는 메인 레퍼런스 카운트를 증가시키지 않으므로 대상 항목이 사라졌는지 확인
하는 작업을 직접 수행해야 한다.
impl Branch {
fn add_leaf(branch: Rc<RefCell<Branch>>, mut leaf: Leaf) {
leaf.owner = Some(Rc::downgrade(&branch));
branch.borrow_mut().leaves.push(Rc::new(RefCell::new(leaf)));
}
fn location(&self) -> String {
match &self.owner {
None => format!("<unowned>.{}", self.id.0),
Some(owner) => {
// 약한 소유자 포인터(weak owner pointer)를 업그레이드한다.
let tree = owner.upgrade().expect("owner gone!");
format!("{}.{}", ...