I'm trying to abstract the initialisation of the glium
crate but I'm having ownership problems. I've been looking the documentation and looks like it may be related to this rule:
- At any given time, you can have either but not both of:
- One mutable reference.
- Any number of immutable references.
I think that I understand the rule, how it applies and why it exists, but I can't see what's happening with my code. I've created a cleaned-up example:
extern crate glium;
use glium::glutin;
pub struct Renderer {
pub events_loop: glium::glutin::EventsLoop,
pub display: glium::Display,
}
impl Renderer {
pub fn new() -> Renderer {
let events_loop = glutin::EventsLoop::new();
let window = glutin::WindowBuilder::new();
let context = glutin::ContextBuilder::new();
let display = glium::Display::new(window, context, &events_loop).unwrap();
Renderer {
events_loop: events_loop,
display: display,
}
}
}
fn main() {
let mut renderer = Renderer::new();
renderer.events_loop.poll_events(|event| {
// Some event handling logic with `match`, somewhere I've this line:
let window_size = renderer.display.gl_window().get_inner_size_pixels().unwrap();
});
}
I get this error:
error[E0502]: cannot borrow `renderer` as immutable because `renderer.events_loop` is also borrowed as mutable
--> src/main.rs:27:38
|
27 | renderer.events_loop.poll_events(|event| {
| -------------------- ^^^^^^^ immutable borrow occurs here
| |
| mutable borrow occurs here
28 | // Some event handling logic with `match`, somewhere I've this line:
29 | let window_size = renderer.display.gl_window().get_inner_size_pixels().unwrap();
| -------- borrow occurs due to use of `renderer` in closure
30 | });
| - mutable borrow ends here
If renderer
is not mutable, I get this one:
error[E0596]: cannot borrow immutable field `renderer.events_loop` as mutable
--> src/main.rs:27:5
|
25 | let renderer = Renderer::new();
| -------- consider changing this to `mut renderer`
26 |
27 | renderer.events_loop.poll_events(|event| {
| ^^^^^^^^^^^^^^^^^^^^ cannot mutably borrow immutable field