Что мне следует использовать RefCell ‹Rc ‹T›› или Rc ‹RefCell ‹T›› для дерева с родителями, которые могут быть видоизменены?

Я хочу реализовать дерево, узел которого имеет поле parent, используя Rust. Из официального руководства add-a-reference-from-a-child-to-its-parent, они используют структуру

struct Node {
    value: i32,
    parent: RefCell<Weak<Node>>,
    children: RefCell<Vec<Rc<Node>>>,
}

Чтобы использовать экземпляр RefCell<Rc<T>> изменчиво, я могу вызвать .borrow_mut().

В документе std::cell < / a>, let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new())); используется для внесения изменчивости в Rc.

Если я хочу дерево с родителями, которые могут быть видоизменены, какое из них я рекомендую?


person Evian    schedule 14.08.2019    source источник
comment
RefCell<Rc> имеет более строгий контроль заимствования: вы можете получить только одну изменяемую ссылку на данные. Rc<RefCell>, позволяет иметь много изменяемых ссылок одновременно. Так что для твоего случая лучше RefCell<Rc>.   -  person Zefick    schedule 14.08.2019
comment
@Zefick Что делать, если T - это структура, и я хочу изменить некоторые поля T в RefCell ‹Rc ‹T››? Я должен использовать RefCell ‹Rc‹ RefCell ‹T› ››?   -  person Evian    schedule 14.08.2019
comment
Да, потому что в этом случае у вас есть две независимо изменяемые сущности - подсчитанные ссылки на T и сам T. Каждой из них нужен свой собственный RefCell.   -  person Zefick    schedule 14.08.2019