У меня есть простой график, который успешно компилирует:Как я должен реструктурировать свой код графа, чтобы избежать ошибки «Заменить заемную переменную как измененную более одного раза за раз»?
use std::collections::HashMap;
type Key = usize;
type Weight = usize;
#[derive(Debug)]
pub struct Node<T> {
key: Key,
value: T,
}
impl<T> Node<T> {
fn new(key: Key, value: T) -> Self {
Node {
key: key,
value: value,
}
}
}
#[derive(Debug)]
pub struct Graph<T> {
map: HashMap<Key, HashMap<Key, Weight>>,
list: HashMap<Key, Node<T>>,
next_key: Key,
}
impl<T> Graph<T> {
pub fn new() -> Self {
Graph {
map: HashMap::new(),
list: HashMap::new(),
next_key: 0,
}
}
pub fn add_node(&mut self, value: T) -> &Node<T> {
let node = self.create_node(value);
node
}
fn create_node(&mut self, value: T) -> &Node<T> {
let key = self.get_next_key();
let node = Node::new(key, value);
self.list.insert(key, node);
self.map.insert(key, HashMap::new());
self.list.get(&key).unwrap()
}
fn get_next_key(&mut self) -> Key {
let key = self.next_key;
self.next_key += 1;
key
}
}
Но он не компилировать, когда я использую его:
fn main() {
let mut graph = Graph::<i32>::new();
let n1 = graph.add_node(111);
let n2 = graph.add_node(222);
}
Ошибка:
error[E0499]: cannot borrow `graph` as mutable more than once at a time
--> src/main.rs:57:14
|
56 | let n1 = graph.add_node(111);
| ----- first mutable borrow occurs here
57 | let n2 = graph.add_node(222);
| ^^^^^ second mutable borrow occurs here
58 | }
| - first borrow ends here
Я видел все подобные вопросы , Я знаю, что это неудачно, потому что метод Graph::add_node()
использует &mut self
. Во всех подобных вопросах общий ответ - «перестроить свой код». Я не понимаю, что мне делать? Как мне переделать этот код?
ваш пример кода является слишком простым для нас, чтобы дать вам хороший совет. Вы можете просто положить 'let n1 = graph.add_node (111);' в блок, а затем ваш код работает, но я уверен, что это не то, что вы хотите. –
@ker Это не пример. Это учебный проект. Я хочу создать простой граф. Но я не могу добавить к нему некоторые узлы. –
Не могли бы вы просто вернуть 'Key' вместо' & Node'? Это не похоже на то, что вам нужно что-то, кроме ключа для создания ребер –