迭代`Vec <box <sometrait>&gt;`时如何可变地借用盒装指针?

时间:2018-01-07 22:36:06

标签: rust borrow-checker

我有这样的自定义特征:

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实例未被传递到任何其他地方,所以我应该能够在这一行的范围内可变地借用,至少根据我的直觉。

0 个答案:

没有答案