Как изменчиво заимствовать указатель в штучной упаковке при переборе `Vec‹Box‹SomeTrait››`?

У меня есть индивидуальная черта, подобная этой:

pub struct SomeObject;

pub trait Renderer {
    fn render(&self) -> Vec<SomeObject>;
}

и модуль с несколькими структурами, реализующими указанную черту. Модуль предоставляет одну функцию:

mod renderer {
    use super::*;
    pub fn all() -> Vec<Box<Renderer>> {
        vec![]
    }
}

который используется в основной функции следующим образом:

fn main() {
    let renderers = renderer::all();

    loop {
        // ...

        let objects: Vec<SomeObject> = renderers.iter().flat_map(|r| r.render()).collect();

        // ...
    }
}

Это работает хорошо до сих пор.

Теперь мне нужно изменить метод render(), чтобы получить изменяемую ссылку на self. Это дает следующую ошибку:

error[E0596]: cannot borrow immutable `Box` content `**r` as mutable
  --> src/main.rs:20:74
   |
20 |             let objects: Vec<SomeObject> = renderers.iter().flat_map(|r| r.render()).collect();
   |                                                                          ^ cannot borrow as mutable

Как я могу это исправить? Экземпляр renderers не используется для передачи в какое-либо другое место, поэтому я должен иметь возможность заимствовать изменчиво в рамках этой строки, по крайней мере, согласно моей интуиции.


person Stefan Majewsky    schedule 07.01.2018    source источник
comment
Просто iter_mut()   -  person Shepmaster    schedule 08.01.2018
comment
@Shepmaster Итак, я потратил полчаса на поиск неправильной половины цепочки итераторов. Большое спасибо!   -  person Stefan Majewsky    schedule 08.01.2018