Изменяемая/неизменяемая ошибка заимствования Rust при закрытии

Я пытаюсь абстрагироваться от инициализации ящика glium, но у меня проблемы с владением. Я просматривал документацию и похоже, что это может быть связано с этим правилом:

  1. At any given time, you can have either but not both of:
    • One mutable reference.
    • Любое количество неизменяемых ссылок.

Я думаю, что понимаю правило, как оно применяется и почему оно существует, но я не вижу, что происходит с моим кодом. Я создал очищенный пример:

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();
    });
}

Я получаю эту ошибку:

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

Если renderer не изменяется, я получаю это:

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

person doup    schedule 18.09.2017    source источник
comment
Решение дубликата применительно к вашему коду.   -  person Shepmaster    schedule 18.09.2017
comment
Спасибо! Кстати, я видел ваш комментарий к редактированию и узнал, что ошибки VS Code не рассказывают всю историю. Сейчас смотрю ошибки в консоли, действительно познавательно. :-)   -  person doup    schedule 19.09.2017
comment
Я надеялся, что VS Code применяет подчеркивание и выделение из простой текстовой формы каким-то графическим способом, а не просто полностью их теряет... Со своей стороны, спасибо, что сообщили мне, что это из VS Code; теперь у меня есть еще одна идея, почему иногда в сообщениях об ошибках отсутствует важная деталь!   -  person Shepmaster    schedule 19.09.2017