Я пытаюсь построить древовидную структуру и поддерживать путь при обходе дерева.Путь ссылок на древовидную структуру
Вот код:
use std::collections::VecDeque;
struct Node {
children: VecDeque<Node>,
}
struct Cursor<'a> {
path: VecDeque<&'a mut Node>,
}
impl<'a> Cursor<'a> {
fn new(n: &mut Node) -> Cursor {
let mut v = VecDeque::new();
v.push_front(n);
Cursor { path: v }
}
fn go_down(&'a mut self, idx: usize) -> bool {
let n = match self.path[0].children.get_mut(idx) {
None => return false,
Some(x) => x
};
self.path.push_front(n);
true
}
}
У меня есть два вопроса. Во-первых, компилятор предложил спецификатор времени жизни в аргументе go_down()
self
, но я не уверен, почему он исправляет сообщаемую проблему.
Даже при этом изменении, однако, приведенный выше код не будет скомпилирован, потому что self.path
заимствован два раза. Есть ли способ поддерживать путь к узлам дерева без написания «небезопасного» кода?
Зачем вам нужен изменяемые ссылки? – Shepmaster
Я хотел бы изменить узлы. Мне нужно только изменить узел в верхней части стека, но я не был уверен, как это выразить. Я мог бы иметь изменяемую ссылку на текущий узел и стек с неизменяемыми ссылками для пути, но тогда я не смог бы создать изменяемую ссылку из неизменяемых при подходе к дереву. – ynimous