неизменяемая переменная, где, по-видимому, предоставляется изменяемая переменная

У меня есть клонируемая структура, называемая 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.


person Bastiaan de Graaf    schedule 28.09.2018    source источник
comment
let mut mutcat = cat; определяет изменяемую привязку к неизменному значению.   -  person Wesley Wiser    schedule 28.09.2018
comment
В порядке! Я вижу, что я думаю. но я пытался получить его как изменяемое значение, которое, я думаю, предоставляется get_categories()? Есть ли способ, которым я упускаю из виду?   -  person Bastiaan de Graaf    schedule 28.09.2018
comment
Я не могу встроить ваш код в игровую площадку, но я думаю, что вам нужно .iter_mut() doc.rust-lang.org/std/primitive.slice.html#method.iter_mut   -  person Wesley Wiser    schedule 28.09.2018
comment
Здесь есть связанный с этим вопрос title="в чем разница между размещением mut перед именем переменной и после"> stackoverflow.com/questions/28587698/   -  person Wesley Wiser    schedule 28.09.2018
comment
Большое спасибо, я изо всех сил пытался предоставить рабочий пример, не выгружая весь проект. Извините за неудобства, я собираюсь взглянуть на метод, который вы предлагаете!   -  person Bastiaan de Graaf    schedule 28.09.2018
comment
Посмотрите, как создать минимальный воспроизводимый пример, а затем отредактируйте свой вопрос, чтобы включить его. Мы не можем сказать, какие ящики, типы, трейты, поля и т. д. присутствуют в коде, например, что такое Node или GenICam. Попробуйте создать что-то, что воспроизводит вашу ошибку на Rust Playground, или вы можете воспроизвести ее в совершенно новом Cargo. проект. Также есть советы по MCVE для Rust.   -  person Shepmaster    schedule 28.09.2018
comment
@BastiaandeGraaf Нет проблем! Просто сообщаю, что я не уверен на 100%. Если это решит вашу проблему, сообщите нам об этом, и мы сможем улучшить ваш вопрос, получив MCVE, демонстрирующий проблему.   -  person Wesley Wiser    schedule 28.09.2018
comment
Я полагаю, что на ваш вопрос отвечают ответы Невозможно заимствовать неизменяемый заимствованный контент как изменяемый и/или Невозможно заимствовать неизменяемый заимствованный контент как изменяемый при реализации двоичного дерева с помощью Rc. Если вы не согласны, измените свой вопрос, чтобы объяснить различия. В противном случае мы можем пометить этот вопрос как уже отвеченный.   -  person Shepmaster    schedule 28.09.2018
comment
вторая ссылка, которую вы предоставили, кажется! сейчас пытаюсь реализовать   -  person Bastiaan de Graaf    schedule 28.09.2018