Использование vec в структуре - PullRequest
0 голосов
/ 31 марта 2019

У меня есть структура, содержащая вектор похожих структур:

struct ProcessNode {
    ...
    children: Vec<Rc<ProcessNode>>,
}

К сожалению, когда я пытаюсь добавить что-то в vec, у меня возникает проблема:

let mut parent_node: &mut Rc<ProcessNode> = ...
let mut parent_children: &mut Vec<Rc<ProcessNode>> = &mut parent_node.children;

Теперь parent_node проверяется во время компиляции, но на parent_children нельзя ссылаться таким образом. Зачем? И как я могу добавить в поле vec в структуре?

1 Ответ

1 голос
/ 31 марта 2019

Я предполагаю, что это сообщение об ошибке, которое вы получаете?

error[E0596]: cannot borrow data in a `&` reference as mutable
  --> src/main.rs:11:58
   |
11 |     let mut parent_children: &mut Vec<Rc<ProcessNode>> = &mut parent_node.children;
   |                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable

Поскольку <a href="https://doc.rust-lang.org/std/rc/struct.Rc.html" rel="nofollow noreferrer">Rc</a><T> дает вам возможность иметь несколько объектов, указывающих на одни и те же данные, это позволит вам только получить неизменную ссылку на их содержимое, в противном случае средство проверки заимствования не сможет гарантировать, что оно выиграло ' не может быть изменено где-то в коде, пока он заимствован где-то еще.

Обходной путь, как правило, заключается в использовании Rc<<a href="https://doc.rust-lang.org/std/cell/struct.RefCell.html" rel="nofollow noreferrer">RefCell</a><T>>, который является типом контейнера, который позволяет получить изменяемую ссылку на данные с неизменяемой ссылкой и выполнить проверку заимствования во время выполнения вместо время компиляции:

let parent_node: &Rc<RefCell<ProcessNode>> = ...;

// get a mutable reference to the ProcessNode
// (this is really a RefMut<ProcessNode> wrapper, and this needs to be in scope for as
// long as the reference is borrowed)
let mut parent_node_mut: RefMut<'_, ProcessNode> = parent_node.borrow_mut();

// get mutable reference to children
let parent_children: &mut Vec<_> = &mut parent_node_mut.children;

Пример игровой площадки

Подробнее об использовании RefCell с Rc вы можете прочитать в документации здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...