children: Vec<Rc<Node>>strong 증가 · 자식을 소유
소유 링크는 Rc, 되돌아보기 링크는 Weak
순환 참조를 피하려면 값의 수명을 결정하는 관계와, 살아 있으면 접근만 하는 관계를 타입으로 분리합니다.
→Rc · owns←Weak · observes
parent: Weak<Node>strong 불변 · upgrade로 생존 확인트리에서 나누는 방향
Vec<Rc<Node>>
부모는 자식을 소유하므로 부모가 살아 있는 동안 자식도 유지됩니다.
RefCell<Weak<Node>>
자식은 부모를 소유하지 않고, 필요할 때만 부모 접근을 시도합니다.
스코프가 끝날 때 결과
branch
strong 1, weak 1로 관찰자를 가집니다.
leaf
branch.children 때문에 strong 2가
됩니다.
None
branch가 버려지면 leaf의 parent.upgrade()는
실패합니다.
데이터 구조를 그릴 때 먼저 “누가 누구를 소유해야 하는가”를 정하고,
반대 방향 탐색은 Weak로 둡니다. 그러면 탐색성은 남기면서
해제 조건은 Rc의 강한 참조만으로 단순하게 유지됩니다.