У меня есть клонируемая структура, называемая GenICam
. Эта структура имеет HashMap
из Rc<dyn Node>
трейтов и HashMap
из Rc<Category>
структур, которые реализуют Node
трейтов. Ключи NodeName
, которые являются псевдонимом для String
.
Каждая категория имеет список имен функций, которые представлены в nodes
HashMap
из GenICam
. Этот список следует использовать для заполнения поля node_list
ссылками на узлы с помощью следующих функций:
use std::{collections::HashMap, rc::Rc};
type NodeName = String;
#[derive(Clone)]
pub struct GenICam {
nodes: HashMap<NodeName, Rc<Node>>,
categories: HashMap<NodeName, Rc<Category>>,
}
impl GenICam {
fn get_categories(&self) -> Vec<Rc<Category>> {
let mut collect = Vec::new();
for i in &self.categories {
collect.push(i.1.clone());
}
collect
}
/// Fills all categories with references to the features if available
fn populate_categories(&mut self) {
let mut cats = self.get_categories();
for cat in cats {
let mut mutcat = cat;
mutcat.populate(&self);
}
}
}
#[derive(Clone)]
pub struct Category {
pub name: NodeName,
features: Vec<String>,
pub node_list: HashMap<NodeName, Rc<Node>>,
}
impl Category {
pub fn populate(&mut self, genicam: &GenICam) {
for feat in &self.clone().features {
let result = genicam.node(feat.to_string());
match result {
None => (),
Some(x) => self.add_to_node_list(x),
};
}
}
/// populate the node hashmap with the given node
pub fn add_to_node_list(&mut self, node: &Rc<Node>) {
println!("Succes: {:?}", node.name());
self.node_list.insert(node.name(), node.clone());
}
}
Я получаю следующую ошибку:
error[E0596]: cannot borrow immutable borrowed content as mutable
--> src/genicam.rs:174:4
|
| mutcat.populate(&self);
| ^^^^^^ cannot borrow as mutable
Я не могу понять, почему mutcat
неизменен, поскольку он определяется как let mut
.
let mut mutcat = cat;
определяет изменяемую привязку к неизменному значению. - person Wesley Wiser   schedule 28.09.2018.iter_mut()
doc.rust-lang.org/std/primitive.slice.html#method.iter_mut - person Wesley Wiser   schedule 28.09.2018Node
илиGenICam
. Попробуйте создать что-то, что воспроизводит вашу ошибку на Rust Playground, или вы можете воспроизвести ее в совершенно новом Cargo. проект. Также есть советы по MCVE для Rust. - person Shepmaster   schedule 28.09.2018